2011-09-08 41 views
4

我試圖在同一窗口(即線圖和散點圖)中繪製兩種類型的圖。在折線圖(第一個圖)中繪製的數據是浮動數值,代表氣候指數(Y)與十進制年(X)。我想成爲「分散」的第二個圖大致相同,但浮動數值表示流量(Y)與十進制年(X)。我試圖做到這一點,用雙X軸和散點圖第二,寄生蟲Y軸如下:在同一窗口中繪製多種類型的圖(線,散點圖,條等)

import mpl_toolkits 
    from mpl_toolkits.axes_grid1 import host_subplot 
    import matplotlib.pyplot as plt 

    host = host_subplot(111) 
    par = host.twinx() 

    host.set_xlim(1880, 2020) 
    host.set_ylim(-5, 10) 

    host.set_xlabel("Time") 
    host.set_ylabel("PDSI Region 01") 
    par.set_ylabel("Minimum 10% Annual 7-day Non-exceedance Flow (cfs)") 

    x1 = timearray 
    y1 = pdsiarray01 
    x2 = upAmm_yr 
    y2 = upAmm_min 

    p1, = host.plot(x1, y1, label="PDSI01") 
    p2, = par.scatter(x2, y2, label="Annual Lowflow Upper Amm") 

    par.set_ylim(30, 60) 

    host.legend() 
    host.axis["left"].label.set_color(p1.get_color()) 
    par.axis["right"].label.set_color(p2.get_color()) 

    plt.draw() 
    plt.show() 

,我得到了錯誤代碼:

TypeError: cannot perform reduce with flexible type 

此代碼當我用以p2開頭的行中的圖代替散點圖時會正常工作,但會產生第二條線圖。我希望分散的最終原因是第二個數據集中有很多要繪製的點,而連接它們的線是分散注意力和「雜亂」(當我需要的時候是及時突出顯示)。條形圖而不是散點圖也可以工作。任何建議或幫助將不勝感激!

+0

相關:http://stackoverflow.com/questions/1746312/why-wont-my-python-scatter-plot-work 努力確保這兩個你數組中有正確的數據類型。你有沒有嘗試將你的y2數組的元素轉化爲float? – Urjit

+0

如果您只想繪製一個繪圖的圓形標記,請不要使用'scatter',只需使用'plot'並指定沒有連線的圓形標記。 (例如'par.plot(x2,y2,'o')'或更詳細地說'par.plot(x2,y2,linestyle ='none',marker ='o')'。散佈用於改變顏色和/或基於第三和第四個變量的標記的大小,它返回的集合與「plot」返回的'Line2D'藝術家不同(並且更加靈活)。沒有理由使用散佈,除非您需要改變顏色或尺寸基於另一個變量 –

回答

4

爲什麼不在兩種情況下都使用plot

import datetime 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 

# Generate some random data 
time = mdates.drange(datetime.datetime(2010, 1, 1), 
        datetime.datetime(2011, 1, 1), 
        datetime.timedelta(days=5)) 
y1 = np.cumsum(np.random.random(time.size) - 0.5) 
y2 = np.cumsum(np.random.random(time.size) - 0.5) 
y2 = y2 * 20 + 10 

# Plot things up... 
fig = plt.figure() 
host = fig.add_subplot(111) 
par = host.twinx() 

host.set_ylabel('One Thing') 
par.set_ylabel('Another') 

line1, = host.plot(time, y1) 
line2, = par.plot(time, y2, 'go') 
host.legend([line1, line2], ['Item 1', 'Item 2']) 

host.xaxis_date() 

plt.show() 

enter image description here

+0

謝謝 - 我是新來的,你的評論和回覆的答案真的有幫助! – hdevs

1

fI無法重現您的確切錯誤,但我不認爲您需要逗號後p2因爲scatter只返回單個值。當更改時,您的代碼適用於我,但p2CircleCollection,它沒有get_color方法。您需要將其更改爲p2.get_facecolor()或其他。