熊猫在一个尺度上绘制两个图

时间:2013-06-12 13:05:53

标签: python matplotlib pandas

我有一个折线图,我最后用一个标记(在这里显示为大红色钻石)。

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

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')%(左,右))

警告仅显示第一次发生。显然,大熊猫不喜欢支持在同一轴上绘制不同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 个答案:

答案 0 :(得分: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风格。

答案 1 :(得分:3)

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

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)