我有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
这是我得到的输出:
它绘制了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
但是,如果您仔细查看x轴,则这些值将不正确。意思是,x轴表示某物的档位或范围,而最后3个档位应按递增顺序位于图中的档位2和3之间。实际上,如果将它们打印出来,则它们在df1
,df2
和df3
中的顺序正确。但是以某种方式在绘制时会改变顺序。那么,我该如何解决?
编辑2:我在问题中输入的数据只是一个可以想到的例子。在我的真实数据集中,数据帧的Col1
值并不完全相同。因此,子图的每一行的x轴值都不同。看起来像这样:
因此,在代码中,直到定义了3个数据帧的部分都必须保持不变。