2013-06-12 84 views
2

我有一個線條圖,我最後用一個標記高亮顯示(在這裏顯示爲紅色的大鑽石)。熊貓在一個尺度上繪製兩個圖表

我使用兩個兩個熊貓圖命令來創建它。問題是我得到意想不到的結果。取決於數據的長度以及我是否將紅色鑽石的情節放在第一位或第二位,我會得到不同的結果。似乎沒有一種我能辨別的模式。如下圖所示

Correct/Expected result

正確/預期的結果有時候我:

enter image description here

和大多數的大型數據集,我得到以下警告時間:

/Users/xxxxx/.virtualenvs/test2/lib/python2.7/site-packages/matplotlib/axes.py:2542:UserWarning:試圖設置相同的left == right results i n個奇異變換;自動擴展。 左= 15727,右= 15727 + '左=%S,右=%s' 的)%(左,右))

的警告僅示出了它發生第一時間。顯然大熊貓不喜歡支持在同一軸上繪製2個不同x系列的不同系列?

可以試試下面的代碼來生成圖形,可以通過傳遞來玩,圖形的Series或Dataframes也可以顛倒紅色鑽石的繪圖順序。也可以更改數據點的數量。我無法在這裏重新創建的一個錯誤是,中間藍線上的紅色鑽石僅向左移動。

代碼:

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或從運行從命令行腳本發生。在兩個最新版本的熊貓中也是不變的。任何想法或明顯的問題?

+0

對我來說,它會創建兩個數字,第一個(前三個的組合,或者前兩個被覆蓋),第二個如果來自最後一個繪圖。奇怪的。可能值得發佈這[github問題](https://github.com/pydata/pandas/issues)。 –

+0

是的,在Ipython中它有時會創建兩個數字。如果作爲腳本運行,它總是將它們合併(將其中的一些進入乳膠文檔)。在下一次重置之前需要一個clf()。不確定這是否是錯誤,或者我誤用了pandas與matplotlib的接口 – Joop

+0

在第一次運行時,您正在清除一個尚不存在的數字。我認爲積極創建圖形和座標軸可以提供更好的可讀代碼。因此,在繪圖之前,例如:'fig,ax = plt.subplots()',然後總是用'ax = ax'將軸傳遞給熊貓。這可以讓您完全掌握/瞭解繪製哪些軸和圖的內容。 –

回答

4

我認爲熊貓默認情況下會創建一個新的情節,而不是使用「活動」情節。捕獲軸並將其傳遞給下一個繪圖命令對我來說工作得很好,而且如果要重新使用軸,就是要走的路。

更改最後兩行的例子:

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

不同的是,(通過大熊貓)由matplotlib返回的軸被捕獲,並與ax=ax再次通過。它也更符合使用matplotlib的首選OO風格。

3

同意以前的答案,但也增加了另一種方式。從官方熊貓文檔改編而來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)