matplotlib循环为每个类别创建子图

Lau*_*raF 2 python matplotlib

我正在尝试编写一个循环,该循环将使图具有25个子图,每个国家1个图。我的代码制作了一个包含25个子图的图形,但是这些图是空的。我该如何更改才能使数据显示在图表中?

fig = plt.figure()

for c,num in zip(countries, xrange(1,26)):
    df0=df[df['Country']==c]
    ax = fig.add_subplot(5,5,num)
    ax.plot(x=df0['Date'], y=df0[['y1','y2','y3','y4']], title=c)

fig.show()
Run Code Online (Sandbox Code Playgroud)

arm*_*ita 5

我不太记得如何使用原始的子情节系统,但您似乎正在重写情节。在任何情况下,您都应该查看gridspec。检查以下示例:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

fig = plt.figure()

gs1 = gridspec.GridSpec(5, 5)
countries = ["Country " + str(i) for i in range(1, 26)]
axs = []
for c, num in zip(countries, range(1,26)):
    axs.append(fig.add_subplot(gs1[num - 1]))
    axs[-1].plot([1, 2, 3], [1, 2, 3])

plt.show()
Run Code Online (Sandbox Code Playgroud)

结果如下:

matplotlib gridspec 示例

只需用您的数据替换示例,它应该可以正常工作。

注意:我注意到您正在使用xrange. 我使用range是因为我的 Python 版本是 3.x。适应您的版本。


Imp*_*est 5

您在matplotlib绘图函数和pandas绘图包装器之间感到困惑。
你的问题是,ax.plot没有任何xy说法。

使用 ax.plot

在这种情况下,这样称呼它ax.plot(df0['Date'], df0[['y1','y2']]),没有xytitle。可能单独设置标题。例:

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

countries = np.random.choice(list("ABCDE"),size=25)
df = pd.DataFrame({"Date" : range(200),
                    'Country' : np.repeat(countries,8),
                    'y1' : np.random.rand(200),
                    'y2' : np.random.rand(200)})

fig = plt.figure()

for c,num in zip(countries, xrange(1,26)):
    df0=df[df['Country']==c]
    ax = fig.add_subplot(5,5,num)
    ax.plot(df0['Date'], df0[['y1','y2']])
    ax.set_title(c)

plt.tight_layout()
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

使用熊猫绘图包装纸

在这种情况下,请通过绘制数据df0.plot(x="Date",y =['y1','y2'])

例:

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

countries = np.random.choice(list("ABCDE"),size=25)
df = pd.DataFrame({"Date" : range(200),
                    'Country' : np.repeat(countries,8),
                    'y1' : np.random.rand(200),
                    'y2' : np.random.rand(200)})

fig = plt.figure()

for c,num in zip(countries, xrange(1,26)):
    df0=df[df['Country']==c]
    ax = fig.add_subplot(5,5,num)
    df0.plot(x="Date",y =['y1','y2'], title=c, ax=ax, legend=False)

plt.tight_layout()
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明