如何将数据框迭代绘制为子图?

时间:2018-08-21 06:36:08

标签: python pandas matplotlib plot graph

我有2个for循环,在其中生成数据帧,并且需要将它们绘制在子图中。这是我的代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

count=1
nrows = 2
ncols = 3

for i in range(ncols):
    for j in range(nrows):
        data1 = {'Col1':['(-2.0, 1.0]', '(1.0, 4.0]', '(4.0, 6.0]', '(6.0, 9.0]', '(9.0, 11.0]', '(11.0, 14.0]', '(14.0, 16.0]', '(16.0, 19.0]', '(19.0, 21.0]', '(21.0, 24.0]'],
                'Col2':list(np.random.randn(10))}
        data2 = {'Col1':['(-2.0, 1.0]', '(1.0, 4.0]', '(4.0, 6.0]', '(6.0, 9.0]', '(9.0, 11.0]', '(11.0, 14.0]', '(14.0, 16.0]', '(16.0, 19.0]', '(19.0, 21.0]', '(21.0, 24.0]'],
                'Col2':list(np.random.randn(10))}
        data3 = {'Col1':['(-2.0, 1.0]', '(1.0, 4.0]', '(4.0, 6.0]', '(6.0, 9.0]', '(9.0, 11.0]', '(11.0, 14.0]', '(14.0, 16.0]', '(16.0, 19.0]', '(19.0, 21.0]', '(21.0, 24.0]'],
                'Col2':list(np.random.randn(10))}

        df1 = pd.DataFrame(data1, columns=['Col1', 'Col2'])
        df2 = pd.DataFrame(data2, columns=['Col1', 'Col2'])
        df3 = pd.DataFrame(data3, columns=['Col1', 'Col2'])




        plt.subplot(ncols, nrows, count)

        # plot df1, df2 & df3 on the same same subplot with 3 different colors    
        ax = df1.plot(x='Col1',y='Col2')
        df2.plot(x='Col1',y='Col2',ax=ax)
        df3.plot(x='Col1',y='Col2',ax=ax)

        count +=1

这是我得到的输出:

enter image description here

它绘制了6个不同的空白子图,但是没有像我想要的那样在3列和2行中绘制,然后将每个图下面的每个图绘制在一起。因此,我们只能看到6个空白子图下方的最后一个图。

如何在6个不同的子图上(2行和3列)绘制6个不同的图?

编辑:我可以使用plt.plot()而不是df.plot用所需的方式进行绘制,如以下代码所示:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

count=1
nrows = 2
ncols = 3

fig = plt.figure(figsize=(20,8))

for i in range(ncols):
    for j in range(nrows):
        data1 = {'Col1':['(-2.0, 1.0]', '(1.0, 4.0]', '(4.0, 6.0]', '(6.0, 9.0]', '(9.0, 11.0]', '(11.0, 14.0]', '(14.0, 16.0]', '(16.0, 19.0]', '(19.0, 21.0]', '(21.0, 24.0]'],
                'Col2':list(np.random.randn(10))}
        data2 = {'Col1':['(-2.0, 1.0]', '(1.0, 4.0]', '(4.0, 6.0]', '(6.0, 9.0]', '(9.0, 11.0]', '(11.0, 14.0]', '(14.0, 16.0]', '(16.0, 19.0]', '(19.0, 21.0]', '(21.0, 24.0]'],
                'Col2':list(np.random.randn(10))}
        data3 = {'Col1':['(-2.0, 1.0]', '(1.0, 4.0]', '(4.0, 6.0]', '(6.0, 9.0]', '(9.0, 11.0]', '(11.0, 14.0]', '(14.0, 16.0]', '(16.0, 19.0]', '(19.0, 21.0]', '(21.0, 24.0]'],
                'Col2':list(np.random.randn(10))}

        df1 = pd.DataFrame(data1, columns=['Col1', 'Col2'])
        df2 = pd.DataFrame(data2, columns=['Col1', 'Col2'])
        df3 = pd.DataFrame(data3, columns=['Col1', 'Col2'])




        plt.subplot(nrows,ncols,count)

        plt.plot([str(i) for i in df1.Col1], df1.Col2, 'o-')
        plt.plot([str(i) for i in df2.Col1], df2.Col2, 'd-')
        plt.plot([str(i) for i in df3.Col1], df3.Col2, 's-')

        plt.xticks(rotation=45)

        fig.subplots_adjust(hspace=0.5)

        count +=1

enter image description here

但是,如果您仔细查看x轴,则这些值将不正确。意思是,x轴表示某物的档位或范围,而最后3个档位应按递增顺序位于图中的档位2和3之间。实际上,如果将它们打印出来,则它们在df1df2df3中的顺序正确。但是以某种方式在绘制时会改变顺序。那么,我该如何解决?

编辑2:我在问题中输入的数据只是一个可以想到的例子。在我的真实数据集中,数据帧的Col1值并不完全相同。因此,子图的每一行的x轴值都不同。看起来像这样:

enter image description here

因此,在代码中,直到定义了3个数据帧的部分都必须保持不变。

0 个答案:

没有答案