2015-09-02 283 views
0

我製作了一張圖表,其中繪製了日期位於x軸上且票據價格位於y軸上的票據價格變化。出於某種原因,連接點的線從第一個點開始,到達最後一個點,然後看起來像連接回其他兩個點,而不是按日期順序連接。這看起來像是一個簡單的問題,但我不能說我在看我的代碼時做了什麼錯誤,因爲我對使用matplotlib仍然很陌生。下面是使圖形的代碼片段:python圖上的線條並不按時間順序連接每個點

fig, ax = plt.subplots() 
ax.xaxis_date() 
# Set date format and major locator of x-axis 
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m'+ '/' '%d' + '/' '%Y')) 
plt.gca().yaxis.set_major_locator(mdates.DayLocator()) 
graph = fig.add_subplot(111) 
xs = [x[0] for x in rows] 
ys = [y[1] for y in rows] 

plt.plot(xs,ys, 'r-o') 
plt.gcf().autofmt_xdate() 
graph.set_xticks(xs) 
plt.title("Ticket Prices over the course of a month") 
plt.xlabel("Date") 
plt.ylabel("Ticket Price") 

根據代碼,可能導致該問題的原因是什麼?該圖的圖像低於:

enter image description here

回答

2

如果xs不在日期排序順序可能發生這種情況。 如果這確實是問題,你可以通過使用argsort修復排序xsys

idx = np.argsort(xs) 
xs = np.array(xs)[idx] 
ys = np.array(ys)[idx] 

例如,

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

rows = [(DT.date(2015,9,2), 25), 
     (DT.date(2015,9,11), 35), 
     (DT.date(2015,9,9), 30), 
     (DT.date(2015,9,5), 27),] 
fig, ax = plt.subplots() 

xs = [x[0] for x in rows] 
ys = [y[1] for y in rows] 
idx = np.argsort(xs) 
xs = np.array(xs)[idx] 
ys = np.array(ys)[idx] 

plt.plot(xs,ys, 'r-o') 
fig.autofmt_xdate() 
ax.set_xticks(xs) 
ax.xaxis_date() 
# Set date format and major locator of x-axis 
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y')) 
ax.yaxis.set_major_locator(mdates.DayLocator()) 

plt.title("Ticket Prices over the course of a month") 
plt.xlabel("Date") 
plt.ylabel("Ticket Price") 
plt.show() 

產生enter image description here


請注意,如果你使用

fig, ax = plt.subplots() 

,那麼你可以用ax取代plt.gca(),因爲plt.gca()返回當前軸。 同樣,您可以用fig替換plt.gcf(),因爲plt.gcf()返回當前數字。

而你可能不應該打電話graph = fig.add_subplot(111),因爲這覆蓋了ax之上的第二個軸。有沒有必要設置

graph.set_xticks(xs) 

以及對ax刻度線,因爲這會導致在x軸兩套刻度線。

+0

謝謝,這是一個非常清晰和簡潔的答案!解決你在最後添加的最後一面注意事項,需要在什麼情況下添加子圖?另外,您是如何使圖表上y軸的範圍比最極端的數據點高1和低? – loremIpsum1771

+1

兩個或多個軸可用於在另一個軸內繪製插入軸。請參閱http://matplotlib.org/examples/axes_grid/inset_locator_demo2.html和http://matplotlib.org/examples/pylab_examples/axes_demo.html。 'y範圍'是由matplotlib自動選擇的。如果您想更改限制,請使用['ax.set_ylim'](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.set_ylim)。 – unutbu