55

我有一组数据,我使用 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 来完成这一切?

谢谢,

4

6 回答 6

78

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

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 有一个非常好的文档页面,其中包含大量示例

2019 年 12 月 17 日:添加plt.show()plt.figure()呼吁澄清这部分故事。

于 2013-10-04T19:54:52.437 回答
22

使用字典!!

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

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 当您想同时弹出所有图时才使用该参数(如果您有很多图,这可能会很混乱)。您可以在loop_plot函数内部或使用函数提供的字典在单独的循环中执行此操作。

只是添加returningfigsaxs不是强制执行plt.show()

于 2016-07-11T10:57:16.257 回答
6

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

好的,首先是屏幕上的示例。请注意,对于每个图形,我们使用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.savefig(filename)替换 plt.show( ) 。与上一个示例的不同之处在于我们不必在每个图上都考虑“阻塞”。另请注意,我们对文件名进行编号。这里我们使用 %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))
于 2019-12-17T18:23:31.663 回答
2

如果您的要求是针对一列进行绘图,请随意使用它(首先将数据导入 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()
于 2021-05-10T03:47:57.637 回答
0

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

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

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

于 2021-03-31T12:05:57.867 回答
0

我们可以创建一个 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])
于 2020-03-19T06:15:15.637 回答