2016-09-21 174 views
1

我想繪製一個x-y圖,用x或y作爲日期變量,並使用第三個變量來着色點。 我設法做到這一點,如果沒有3個變量是日期,使用:蟒蛇 - 散點圖日期和第三個變量作爲顏色

ax.scatter(df['x'],df['y'],s=20,c=df['z'], marker = 'o', cmap = cm.jet) 

搜索後,我發現,正常的陰謀,我們必須使用plot_date()。不幸的是,我沒有能夠着色點。 任何人都可以幫助我嗎?

這裏是一個小例子:

import matplotlib, datetime 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
import pandas as pd 

todayTime=datetime.datetime.now(); 
df = pd.DataFrame({'x': [todayTime+datetime.timedelta(hours=i) for i in range(10)], 'y': range(10),'z' : [2*j for j in range(10)]}); 
xAlt=[0.5*i for i in range(10)]; 

fig, ax = plt.subplots() 
ax.scatter(df['x'],df['y'],s=20,c=df['z'], marker = 'o', cmap = cm.jet) 
plt.show() 

您可以替換DF [ 'X']由xAlt看到期望的結果

謝謝

回答

1

據我所知,一個必須使用scatter才能按照您描述的方式着色點。一種解決方法是使用FuncFormatter將刻度標籤轉換爲x軸上的時間。下面的代碼將日期轉換爲數字,繪製散點圖,並使用FuncFormatter將刻度標籤轉換回日期。

import matplotlib, datetime 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
import pandas as pd 
from matplotlib.ticker import FuncFormatter 

todayTime=datetime.datetime.now() 
df = pd.DataFrame({'x': [todayTime+datetime.timedelta(hours=i) for i in range(10)], 'y': range(10),'z' : [2*j for j in range(10)]}) 

def my_formatter(x, pos=None): 
    d = matplotlib.dates.num2date(x) 
    if len(str(d.minute)) == 1: 
     mn = '0{}'.format(d.minute) 
    else: 
     mn = str(d.minute) 
    if len(str(d.hour)) == 1: 
     hr = '0{}'.format(d.hour) 
    else: 
     hr = str(d.hour) 
    return hr+':'+mn 

major_formatter=FuncFormatter(my_formatter) 

nums = np.array([matplotlib.dates.date2num(di) for di in df['x']]) 

fig, ax = plt.subplots() 
ax.xaxis.set_major_formatter(major_formatter) 
ax.scatter(nums,df['y'],s=20,c=df['z'], marker = 'o', cmap = cm.jet) 
xmin = df['x'][0]-datetime.timedelta(hours=1) 
xmax = df['x'][len(df['x'])-1]+datetime.timedelta(hours=1) 
ax.set_xlim((xmin,xmax)) 
plt.show() 
+0

謝謝你的回答。不幸的是,這不是我所期待的。它已經適用於xAlt。我想這樣做: ax.scatter(df ['x'],df ['y'],s = 20,c = df ['z'],marker ='o',cmap = cm.jet) –

+0

關鍵是用'xAlt'繪圖,然後用'my_formatter'函數在x-ticks中轉換'xAlt' - >'df ['x']'。這應該會在x軸上產生一個時間圖,並用第三個數組着色點。你有沒有嘗試運行上面的代碼片段?你不能使用'scatter'和'df ['x']',所以你需要使用一個類似於我所建議的解決方法。 –

+0

好吧,我明白了!非常感謝 –

相關問題