【问题标题】:Pandas plotting two graphs on one scale熊猫在一个比例上绘制两个图表
【发布时间】:2016-06-03 20:00:27
【问题描述】:

我有一个折线图,我在最后用标记突出显示(此处显示为大红色菱形)。

我正在使用两个两个 pandas 绘图命令来创建它。问题是我得到了意想不到的结果。根据数据的长度以及我是否将红色菱形图放在第一位或第二位,我会得到不同的结果。似乎没有我能辨别的模式。正确/预期结果如下所示

有时我得到:

在大多数情况下使用大数据集时,我会收到以下警告:

/Users/xxxxx/.virtualenvs/test2/lib/python2.7/site-packages/matplotlib/axes.py:2542:用户警告:尝试设置相同的左==右结果 在奇异变换中;自动展开。 左=15727,右=15727 + 'left=%s, right=%s') % (left, right))

警告仅显示第一次发生。显然 pandas 不喜欢支持在同一轴上绘制具有不同 x 比例的 2 个不同系列?

可以尝试下面的代码来生成图表,可以通过传递,Series 或 Dataframes for plot 也可以反转红色菱形的绘制顺序。也可以改变数据点的数量。我无法在此处重新创建的一个错误是中间的红色菱形和仅向左的蓝色线。

代码:

plot_with_series = False
reverse_order = False
import pandas as pd
dates = pd.date_range('20101115', periods=800)
df =  pd.DataFrame(randn(len(dates)), index = dates, columns = ['A'])
ds = pd.Series(randn(len(dates)), index = dates)
clf()
if plot_with_series:
    if reverse_order: ds.plot()
    ds.tail(1).plot(style='rD', markersize=20)
    if not reverse_order: ds.plot()
else:
    if reverse_order: df.plot(legend=False)
    df.A.tail(1).plot(style='rD', markersize=20,legend=False)
    if not reverse_order: df.plot(legend=False)

错误/警告发生在 IPython 中或从命令行运行 as 脚本。在 2 个最新版本的 pandas 中也保持不变。有什么想法或明显的问题吗?

【问题讨论】:

  • 对我来说,它创建了两个数字,第一个(是前三个的组合,或者前两个被覆盖),第二个如果来自最后一个情节。诡异的。可能值得将其发布为github issue
  • 是的,在 Ipython 中它有时会创建两个图形。如果作为脚本运行,它总是将它们合并(得到一堆这些进入乳胶文档)。在下一个重置之前需要一个 clf() 。不确定这是错误还是我在 matplotlib 中滥用 pandas 的界面
  • 第一次运行时,您正在清除一个尚不存在的图形。我认为自己主动创建图形和轴可以为您提供更好的可读性代码。因此,在绘图之前:例如fig, ax = plt.subplots(),然后始终使用ax=ax 将轴传递给熊猫。这使您可以完全控制/了解在哪些轴和图形上绘制的内容。

标签: python matplotlib pandas


【解决方案1】:

我认为 pandas 默认情况下会创建一个新图,而不是使用“活动”图。捕获坐标轴并将其传递给下一个绘图命令对我来说很好,如果您想重用坐标轴,这是一种方法。

将示例中的最后两行更改为:

ax = df.A.tail(1).plot(style='rD', markersize=20,legend=False)
if not reverse_order: df.plot(legend=False, ax=ax)

不同之处在于 matplotlib(通过 pandas)返回的轴被捕获,并再次使用 ax=ax 传递。它也更符合使用 matplotlib 的首选 OO 风格。

【讨论】:

    【解决方案2】:

    同意之前的回答,但也添加了另一种方式。改编自 pandas 官方关于绘图的文档http://pandas.pydata.org/pandas-docs/stable/visualization.html
    我刚刚将 DataFrame 的第二列调整为填充的 nan 列上的最后一个点。

    df['B'] = np.nan 
    df['B'][-1] = df.A[-1]   # Just 1 datapoint
    plt.figure()
    with pd.plot_params.use('x_compat', True):
        df.A.plot(color='b')
        df.B.plot(style='rD', markersize=12)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多