matplotlib 使用循环绘制n个图表Python

5kgi1eie  于 2022-12-27  发布在  Python
关注(0)|答案(6)|浏览(155)

我有一组数据,我用panda数据框加载到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还是应该使用panda来完成这一切?
谢谢你,

2eafrhcq

2eafrhcq1#

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

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()调用,以阐明这部分内容。

yacmzcpb

yacmzcpb2#

使用字典!!

也可以使用字典,以便对图进行更多控制:

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=Falseonly(如果你有很多情节,这可能会相当混乱)。您可以在loop_plot函数内部或使用该函数提供的字典在单独的循环中执行此操作。
仅将return添加到figsaxs并不强制执行plt.show()

ldioqlga

ldioqlga3#

以下是两个如何在单独窗口(框架)中生成图形的示例,以及一个如何生成图形并将其保存到单独图形文件中的示例。
好的,首先是屏幕上的例子,注意我们为每个图形使用了一个单独的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在循环中使用www.example.com(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))
q1qsirdb

q1qsirdb4#

如果您的要求是针对一列绘图,那么请随意使用(首先将数据导入PandasDF)(绘制一个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()
6ljaweal

6ljaweal5#

在不同帧上绘图的简单方法如下所示:

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

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

mxg2im7a

mxg2im7a6#

我们可以创建一个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])

相关问题