Pandas 在一个比例尺上绘制两个图表

问题描述 投票:0回答:3

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

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

Correct / Expected result

有时我会得到:

enter image description here

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

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

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

可以尝试下面的代码来生成图表,可以通过传递、系列或数据帧进行绘图也可以反转红色菱形的绘制顺序。 还可以更改数据点的数量。 我无法在此处重现的一个错误是中间的红色菱形和蓝色的线仅向左移动。

代码:

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 中也保持不变。 有什么想法或明显的问题吗?

python matplotlib pandas
3个回答
4
投票

我认为 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 风格。


3
投票

同意之前的答案,但还添加了另一种方式。改编自 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)

0
投票

我找到了另一种在同一张图中有效绘制两个 pandas 数据框或系列的方法。首先,从 matplotlib 分配一个轴。然后对于每个 pandas 数据框或系列,将轴发送到绘图命令。

ax = plt.axes()
df1.plot(ax=ax)
df2.plot(ax=ax)
© www.soinside.com 2019 - 2024. All rights reserved.