【问题标题】:Use a loop to plot n charts Python使用循环绘制 n 个图表 Python
【发布时间】:2013-10-11 22:33:17
【问题描述】:

我有一组数据,我使用 pandas 数据框加载到 python 中。我想做的是创建一个循环,该循环将为它们自己的框架中的所有元素打印一个图,而不是全部在一个上。我的数据以这种方式存储在一个 excel 文件中:

Index | DATE  | AMB CO 1 | AMB CO 2 |...|AMB CO_n | TOTAL
1     | 1/1/12|  14      | 33       |...|  236    | 1600
.     | ...   | ...      | ...      |...|  ...    | ...
.     | ...   | ...      | ...      |...|  ...    | ...
.     | ...   | ...      | ...      |...|  ...    | ...
n

这是我目前所拥有的代码:

import pandas as pd
import matplotlib.pyplot as plt
ambdf = pd.read_excel('Ambulance.xlsx', 
                      sheetname='Sheet2', index_col=0, na_values=['NA'])
print type(ambdf)
print ambdf
print ambdf['EAS']

amb_plot = plt.plot(ambdf['EAS'], linewidth=2)
plt.title('EAS Ambulance Numbers')
plt.xlabel('Month')
plt.ylabel('Count of Deliveries')
print amb_plot

for i in ambdf:
    print plt.plot(ambdf[i], linewidth = 2)

我正在考虑做这样的事情:

for i in ambdf:
    ambdf_plot = plt.plot(ambdf, linewidth = 2)

以上内容并不是我想要的,它源于我对 Pandas、MatplotLib 等的不熟悉,查看了一些文档,但在我看来,甚至不需要 matplotlib(问题 2)

所以 A)如何为我的 df 中的每一列生成数据图 B)我需要使用 matplotlib 还是应该只使用 pandas 来完成这一切?

谢谢,

【问题讨论】:

  • 您可以为每一列的绘图添加额外的系列,或者为每列创建一个单独的绘图。我猜你更喜欢后者?此外,matplotlib 是一个非常标准的绘图模块,非常易于使用,并且工作起来就像做梦一样。
  • 真的没关系,这只是为了让我使用它并练习它,惯例会规定一种方法而不是另一种方法吗?

标签: python-2.7 matplotlib pandas


【解决方案1】:

好的,创建多个图的最简单方法是:

import matplotlib.pyplot as plt
x=[[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]]
y=[[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]]
for i in range(len(x)):
    plt.figure()
    plt.plot(x[i],y[i])
    # Show/save figure as desired.
    plt.show()
# Can show all four figures at once by calling plt.show() here, outside the loop.
#plt.show()

请注意,您需要每次都创建一个figure,否则pyplot 将在创建的第一个中绘制。

如果您想创建多个数据系列,您只需:

import matplotlib.pyplot as plt
plt.figure()
x=[[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]]
y=[[1,2,3,4],[2,3,4,5],[3,4,5,6],[7,8,9,10]]
plt.plot(x[0],y[0],'r',x[1],y[1],'g',x[2],y[2],'b',x[3],y[3],'k')

您可以通过拥有像['r','g','b','k'] 这样的颜色列表来自动化它,然后如果您愿意,只需调用此列表中的两个条目和相应的数据以循环绘制。如果您只想以编程方式将数据系列添加到一个绘图中,则可以这样做(每次都不会创建新图形,因此所有内容都绘制在同一个图形中):

import matplotlib.pyplot as plt
x=[[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]]
y=[[1,2,3,4],[2,3,4,5],[3,4,5,6],[7,8,9,10]]
colours=['r','g','b','k']
plt.figure() # In this example, all the plots will be in one figure.    
for i in range(len(x)):
    plt.plot(x[i],y[i],colours[i])
plt.show()

希望这会有所帮助。如果有的话,matplotlib 有一个非常好的 documentation page 和很多 examples

2019 年 12 月 17 日:添加了 plt.show()plt.figure() 电话以澄清这部分故事。

【讨论】:

  • 奇怪的是我不得不写 plt.pyplot.plot 很奇怪
  • 这很奇怪,我知道为什么。我在发布之前测试了我的代码,对我来说它可以正常工作。
  • 我也没有,我在工作中不需要做这样的事情,哦,没什么大不了的,框架理解正是我所需要的,再次感谢。
  • 这可能与您的模块在这两个地方的设置方式有关(以及这与我的方式有什么关系)。我使用 SPYDER,它可以立即安装 numpy、matplotlib 和大量其他有用的东西。取决于你使用 python 的目的,但对于科学的东西来说它很棒:pypi.python.org/pypi/spyder
  • 双怪,我也在用SPYDER,工作是windows XP机器,家里是我的Ubuntu 13.04笔记本电脑(那是我遇到问题的地方)
【解决方案2】:

使用字典!!

您还可以使用字典来更好地控制绘图:

import matplotlib.pyplot as plt
#   plot 0     plot 1    plot 2   plot 3
x=[[1,2,3,4],[1,4,3,4],[1,2,3,4],[9,8,7,4]]
y=[[3,2,3,4],[3,6,3,4],[6,7,8,9],[3,2,2,4]]

plots = zip(x,y)
def loop_plot(plots):
    figs={}
    axs={}
    for idx,plot in enumerate(plots):
        figs[idx]=plt.figure()
        axs[idx]=figs[idx].add_subplot(111)
        axs[idx].plot(plot[0],plot[1])
    return figs, axs  
        
figs, axs = loop_plot(plots)

现在您可以轻松选择要修改的绘图:

axs[0].set_title("Now I can control it!")

当然,如何处理这些情节由您决定。您可以将它们保存到磁盘figs[idx].savefig("plot_%s.png" %idx) 或显示它们plt.show()。如果您想一起弹出所有图,请使用参数block=False only(如果您有很多图,这可能会很混乱)。您可以在 loop_plot 函数内或使用该函数提供的字典在单独的循环中执行此操作。

只需添加returning figsaxs 不是强制执行plt.show()

【讨论】:

  • 这太漂亮了!你为我节省了很多时间和精力!
  • @MCP_infiltrator 仍然不正确,没有 plt.show(0 或 plt.savefig() 就没有输出。诀窍在于何时以及如何使用这些调用,请参阅我的答案。
  • 谢谢,Drm 我认为很明显用户必须根据自己的需要使用 plt.show 或 savefig,但也许我没有澄清答案。
【解决方案3】:

以下是如何在单独的窗口(框架)中生成图形的两个示例,以及如何生成图形并将其保存到单独的图形文件中的示例。

好的,首先是屏幕上的示例。请注意,对于每个图形,我们使用 plt.figure() 的单独实例和 plt.plot()。最后,我们必须调用 plt.show() 将其全部显示在屏幕上。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace( 0,10 )

for n in range(3):
    y = np.sin( x+n )
    plt.figure()
    plt.plot( x, y )

plt.show()

另一种方法是在循环中使用 plt.show(block=False):

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace( 0,10 )

for n in range(3):
    y = np.sin( x+n )
    plt.figure()
    plt.plot( x, y )
    plt.show( block=False )

现在,让我们生成图表,然后将它们分别写入一个文件。这里我们将 plt.show() 替换为 plt.savefig( filename )。与上一个示例的不同之处在于,我们不必在每个图上都考虑“阻塞”。另请注意,我们对文件名进行编号。这里我们使用 %03d 以便我们之后可以方便地按数字顺序排列它们。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace( 0,10 )

for n in range(3):
    y = np.sin( x+n )
    plt.figure()
    plt.plot( x, y )
    plt.savefig('myfilename%03d.png'%(n))

【讨论】:

    【解决方案4】:

    我们可以创建一个 for 循环并将所有数字列传递给它。 正如我们所包含的那样,循环将在单独的窗格中一张一张地绘制图表 plt.figure() 进去。

    import pandas as pd
    import seaborn as sns
    import numpy as np
    
    numeric_features=[x for x in data.columns if data[x].dtype!="object"]
    #taking only the numeric columns from the dataframe.
    
    for i in data[numeric_features].columns:
        plt.figure(figsize=(12,5))
        plt.title(i)
        sns.boxplot(data=data[i])
    

    【讨论】:

      【解决方案5】:

      在不同帧上绘制的简单方法如下:

      import matplotlib.pyplot as plt  
      for grp in list_groups:
              plt.figure()
              plt.plot(grp)
              plt.show()
      

      然后python会为每次迭代绘制多个帧。

      【讨论】:

        【解决方案6】:

        如果您的要求是针对一列进行绘图,请随意使用它(首先将数据导入 pandas DF)(绘制一个包含 5 列和所需行数的图矩阵)

        import math
        i,j=0,0
        PLOTS_PER_ROW = 5
        fig, axs = plt.subplots(math.ceil(len(df.columns)/PLOTS_PER_ROW),PLOTS_PER_ROW, figsize=(20, 60))
        for col in df.columns:
            axs[i][j].scatter(df['target_col'], df[col], s=3)
            axs[i][j].set_ylabel(col)
            j+=1
            if j%PLOTS_PER_ROW==0:
                i+=1
                j=0
        plt.show()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-31
          • 2021-04-15
          • 1970-01-01
          • 2021-05-25
          • 1970-01-01
          • 2023-04-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多