为什么在绘制pd.DataFrame和pd.Series时plt.figure(figsize)呈现不同的结果?

时间:2019-02-13 12:32:53

标签: python pandas matplotlib

在下面的两个代码段中,唯一的区别似乎是数据源类型(pd.Seriespd.DataFrame),plt.figure(num=None, figsize=(12, 3), dpi=80)在一种情况下是否有效,而在另一种情况下没有效果使用pd.DataFrame.plot时是什么?


代码段1-调整数据为熊猫系列时的地块大小

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

# data
np.random.seed(123)
df = pd.Series(np.random.randn(10000),index=pd.date_range('1/1/2000', periods=10000)).cumsum()
print(type(df))

# plot
plt.figure(num=None, figsize=(12, 3), dpi=80)
ax = df.plot()
plt.show()

输出1 enter image description here

代码段2-现在数据源是一个熊猫数据框

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

# data
np.random.seed(123)
dfx = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2000', periods=100)).cumsum()
dfy = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2000', periods=100)).cumsum()
df = pd.concat([dfx, dfy], axis = 1)
print(type(df))

# plot
plt.figure(num=None, figsize=(12, 3), dpi=80)
ax = df.plot()
plt.show()

enter image description here

这里唯一的区别似乎是数据源的类型。为什么对于matplotlib输出会有话要说?

1 个答案:

答案 0 :(得分:1)

看来pd.Dataframe.plot()的运作方式与pd.Series.plot()有所不同。由于数据框可能具有任意数量的列,可能需要子图,不同的轴等,因此Pandas默认创建新的figure。解决此问题的方法是将参数直接传递给plot调用,即df.plot(figsize=(12, 3))(不幸的是,dpi不被接受为关键字参数)。您可以在this great answer中了解更多信息:

  

在第一种情况下,您可以通过fig =创建matplotlib图   plt.figure(figsize =(10,4)),然后绘制单列DataFrame。   现在熊猫图功能的内部逻辑是检查是否存在   matplotlib状态机中已经存在一个数字,如果存在,   使用它的当前轴来绘制列值。这是作为   预期的。

     

但是,在第二种情况下,数据由两列组成。那里   有几种方法来处理这样的情节,包括使用   具有共享或非共享轴等的不同子图。为了   熊猫能够应用任何这些可能的要求,它将   默认情况下,创建一个新图形,可以向其中添加坐标轴   至。新的图形将不知道已经存在的图形,并且   它的大小,但是具有默认大小,除非您指定   figsize参数。