【问题标题】:Why does plt.figure(figsize) render different results when plotting pd.DataFrame and pd.Series? [duplicate]为什么在绘制 pd.DataFrame 和 pd.Series 时 plt.figure(figsize) 会呈现不同的结果? [复制]
【发布时间】:2019-02-13 12:32:52
【问题描述】:

在下面的两个 sn-ps 中,唯一的区别似乎是数据源类型(pd.Seriespd.DataFrame),plt.figure(num=None, figsize=(12, 3), dpi=80) 在使用 @987654321 时是否在一种情况下有效但在另一种情况下无效@?


片段 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

Snippet 2 - 现在数据源是 pandas Dataframe

# 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()

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

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案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。 现在pandas plot函数的内部逻辑是检查是否有 matplotlib 状态机中已经存在一个图形,如果是, 使用它的当前轴将列值绘制到它。这作为 预计。

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

    【讨论】:

    • 感谢您的回答!你的建议很有效!我有点困惑,我没有找到您自己提供的链接,因为我确实尝试过。所以我想是时候拿出欺骗锤了,尽管我的问题可能更具体一点。
    • 很高兴我能帮上忙!我不确定这是否完全是一个骗局——我会留给模组来决定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    相关资源
    最近更新 更多