如何将单独的Pan​​das DataFrames绘制为子图?

Jim*_*y C 97 python matplotlib pandas

我有一些Pandas DataFrames共享相同的值规模,但具有不同的列和索引.在调用时df.plot(),我会获得单独的绘图图像.我真正想要的是将它们全部放在与次要情节相同的情节中,但遗憾的是我没有想出一个如何并且非常欣赏一些帮助的解决方案.

jor*_*ris 200

您可以使用matplotlib手动创建子图,然后使用ax关键字在特定子图上绘制数据框.例如,对于4个子图(2x2):

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, ncols=2)

df1.plot(ax=axes[0,0])
df2.plot(ax=axes[0,1])
...
Run Code Online (Sandbox Code Playgroud)

axes是一个包含不同子图轴的数组,您只需通过索引即可访问一个axes.
如果你想有一个共享的X轴,那么你可以提供sharex=Trueplt.subplots.

  • 请注意,令人恼火的是,`.subpots()`会根据您正在创建的子图阵列的尺寸返回不同的坐标系.因此,如果返回子图,例如,`nrows = 2,ncols = 1`,则需要将轴索引为`axes [0]`和`axes [1]`.请参见http://stackoverflow.com/a/21967899/1569221 (28认同)
  • @canary_in_the_data_mine如果使用`.subplot()`的默认参数,那只会很烦人.设置`squeeze = False`来强制`.subplot()`在任何行和列的情况下总是返回一个`ndarray`. (6认同)
  • @canary_in_the_data_mine谢谢,这真烦人...你的评论让我节省了一些时间:)无法弄清楚为什么我会得到`IndexError:数组索引太多了 (3认同)

sed*_*deh 50

你可以看到e.gs. 在证明joris答案的文档中.另外,从文档,您也可以设置subplots=Truelayout=(,)大熊猫内plot功能:

df.plot(subplots=True, layout=(1,2))
Run Code Online (Sandbox Code Playgroud)

你也可以使用fig.add_subplot()这需要插曲电网参数,如221,222,223,224,等,在后描述这里.在这个ipython笔记本中可以看到关于pandas数据框的情节的好例子,包括子图.

  • 尽管 joris 的回答对于一般的 matplotlib 使用非常有用,但对于想要使用 Pandas 进行快速数据可视化的任何人来说,这都是非常好的。它也更符合问题。 (2认同)
  • 请记住,`subplots` 和 `layout` kwargs 只会为单个数据帧生成多个图。这与 OP 将多个数据框绘制成单个图的问题有关,但不是解决方案。 (2认同)
  • 这是纯 Pandas 使用的更好答案。这不需要直接导入 matplotlib(尽管您通常应该这样做)并且不需要循环任意形状(例如可以使用`layout=(df.shape[1], 1)`)。 (2认同)

Dr.*_*lan 21

您可以使用 matplotlib 绘制多个 Pandas 数据框的多个子图,并使用一个简单的技巧来制作所有数据框的列表。然后使用 for 循环绘制子图。

工作代码:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# dataframe sample data
df1 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
df2 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
df3 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
df4 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
df5 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
df6 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])

#define number of rows and columns for subplots
nrow=3
ncol=2

# make a list of all dataframes 
df_list = [df1 ,df2, df3, df4, df5, df6]
fig, axes = plt.subplots(nrow, ncol)

# plot counter
count=0
for r in range(nrow):
    for c in range(ncol):
        df_list[count].plot(ax=axes[r,c])
        count+=1
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

使用此代码,您可以在任何配置中绘制子图。您需要定义行nrow数和列数ncol。此外,您需要制作df_list要绘制的数据框列表。


Q-m*_*man 14

您可以使用熟悉的Matplotlib风格调用figuresubplot,但你只需要使用指定当前轴plt.gca().一个例子:

plt.figure(1)
plt.subplot(2,2,1)
df.A.plot() #no need to specify for first axis
plt.subplot(2,2,2)
df.B.plot(ax=plt.gca())
plt.subplot(2,2,3)
df.C.plot(ax=plt.gca())
Run Code Online (Sandbox Code Playgroud)

等等...

  • 我认为在第一个图上使用 `ax=plt.gca()` 也很好。 (2认同)

Joe*_*Joe 8

你可以使用这个:

fig = plt.figure()
ax = fig.add_subplot(221)
plt.plot(x,y)

ax = fig.add_subplot(222)
plt.plot(x,z)
...

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


duh*_*ime 5

您可能根本不需要使用 Pandas。这是猫频率的 matplotlib 图:

在此处输入图片说明

x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)

f, axes = plt.subplots(2, 1)
for c, i in enumerate(axes):
  axes[c].plot(x, y)
  axes[c].set_title('cats')
plt.tight_layout()
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

128511 次

最近记录:

6 年,2 月 前