使用pandas plot方法设置图形大小时不一致

时间:2017-02-13 23:16:38

标签: python pandas matplotlib plot

我正在尝试使用pandas数据帧的绘图方法的便利性,同时调整生成的图形的大小。 (我将数据保存到文件中,并在Jupyter笔记本中内联显示)。我发现下面的方法在大多数情况下都是成功的,除非我在同一个图表上绘制两条线 - 然后图形会回到默认大小。

我怀疑这可能是由于系列图和数据框图之间的差异所致。

设置示例代码:

data = {
    'A': 90 + np.random.randn(366),
    'B': 85 + np.random.randn(366)
}

date_range = pd.date_range('2016-01-01', '2016-12-31')

index = pd.Index(date_range, name='Date')

df = pd.DataFrame(data=data, index=index)

控制 - 此代码生成预期结果(宽图):

fig = plt.figure(figsize=(10,4))

df['A'].plot()
plt.savefig("plot1.png")
plt.show()

结果:

plot1.png

绘制两条线 - 图形大小不是(10,4)

fig = plt.figure(figsize=(10,4))

df[['A', 'B']].plot()
plt.savefig("plot2.png")
plt.show()

结果:

plot2.png

这样做的正确方法是什么,无论选择的系列数量如何,数字大小都是一致的设置?

2 个答案:

答案 0 :(得分:18)

这两种情况之间存在差异的原因有点隐藏在fig = plt.figure(figsize=(10,4))的逻辑中。正如在the documentation中可以看到的,这种方法允许传递许多参数,以便它可以处理各种不同的情况。

在第一种情况下,您可以通过figsize创建一个matplotlib图形,然后绘制单个列DataFrame。现在,pandas plot函数的内部逻辑是检查matplotlib状态机中是否已存在数字,如果是,则使用它的当前轴绘制列值。这可以按预期工作。

然而,在第二种情况下,数据由两列组成。有几种选择如何处理这样的图,包括使用具有共享或非共享轴等的不同子图。为了使pandas能够应用任何这些可能的要求,它将默认创建一个新的图形。可以添加轴以绘制到。除非指定df[['A', 'B']].plot(figsize=(10,4))参数,否则新数字将不知道已存在的数字及其大小,而是具有默认大小。

在评论中,您说可能的解决方案是使用plt.show()。这是正确的,但您需要省略初始数字的创建。否则它将产生2个数字,这可能是不希望的。在笔记本中,这将不可见,但如果你在最后以import pandas as pd import matplotlib.pyplot as plt df = pd.DataFrame({"A":[2,3,1], "B":[1,2,2]}) df[['A', 'B']].plot(figsize=(10,4)) plt.show() 作为通常的python脚本运行它,将会打开两个图形窗口。

所以让pandas负责图形创建的解决方案是

ax

绕过创建新数字的一种方法是向pandas.DataFrame.plot(ax=ax)函数提供ax参数,其中plt.gca()是外部创建的轴。该轴可以是通过import pandas as pd import matplotlib.pyplot as plt df = pd.DataFrame({"A":[2,3,1], "B":[1,2,2]}) plt.figure(figsize=(10,4)) df[['A', 'B']].plot(ax = plt.gca()) plt.show() 获得的标准轴。

containerURL(forSecurityApplicationGroupIdentifier:

或者使用answer from PaulH中看到的面向对象的方式。

答案 1 :(得分:5)

始终在FigureAxes对象上明确直接操作。不要依赖pyplot状态机。在你的情况下,这意味着:

fig1, ax1 = plt.subplots(figsize=(10,4))
df['A'].plot(ax=ax1)
fig1.savefig("plot1.png")


fig2, ax2 = plt.figure(figsize=(10,4)) 
df[['A', 'B']].plot(ax=ax2)
fig2.savefig("plot2.png")

plt.show()