2017-09-05 82 views
-1

我有一個問題,這個問題延續了我之前詢問過的,這次是關於如何更改x記號。將x記號更改爲月份和日期

Multiindex scatter plot

讓我重複設置,所以你不必去鏈接。假設我有以下數據:

data = {'Value': {('1', 1): 3.0, 
('1', 2): 4.0, 
('1', 3): 51.0, 
('1', 4): 10.0, 
('1', 5): 2.0, 
('1', 6): 17.0, 
('1', 7): 14.0, 
('1', 8): 7.0, 
('1', 9): 2.0, 
('1', 10): 1.0}} 
df=pd.DataFrame(data) 

假設這代表了1月份前10天的某些值。我想繪製這個數據,所以我用:

df.plot() 
plt.show() 

現在,假設我有一個具有值這些日期的略有不同的值,但是相同的索引值的子集,另一個數據集:

df1 = df[df['Value']<10] 
df1['Value'] = df1['Value']*2 

每答案,我可以覆蓋一個散點圖爲:

ax = df.plot() 
df1.reindex(df.index).plot(marker='o',linestyle='none',color='g', ax=ax) 

在更普遍的例子,其中x軸表示一年365天(非閏年),我怎麼能得到x刻度代表每個月的第一天?我能想出的最佳解決方案是:

plt.xticks(np.arange(0,365,30),['1/1','2/1','3/1','4/1','5/1','6/1','7/1','8/1','9/1','10/1','11/1','12/1']) 

當然,這並不是完全正確的,因爲這幾個月不是全部30天。什麼是更簡單/準確的方法?

+0

你想要這個也牽扯熊貓吧? –

+0

這可能是最好的。 – user21359

回答

1

假設我理解你,這並不難。大部分行動發生在熊貓之外。這似乎意味着在設置刻度時有相當大的自由度。

import pandas as pd 
from datetime import datetime 
import matplotlib.pyplot as plt 

df = pd.DataFrame(
    data = { 
     'Values' : [3, 4, 5, 6, 2, 7, 6, 3, 4, 2, 4, 5], 
     'Months': [datetime(2017, _, 1) for _ in range(1,13)] 
    } 
    ) 
ax = df.plot() 
ax.set_xticks(list(range(0,12))) 
ax.set_xticklabels([datetime(2017,_,1).strftime('%b') for _ in range(1,13)]) 
plt.show() 

您還問過關於刻度線位置的精度。在上面的代碼中,勾選展示位置只是月份數的線性函數。幾乎沒有什麼可以獲得 - 在一個情節 - 從做更復雜的事情。

這裏我根據月份的長度和1月1日到12月1日的總天數,更仔細地計算點位置,並將其與圖中使用的較簡單的計算進行比較。沒有什麼區別。

>>> for m in range(1, 13): 
...  '%.3f %.3f' % ((m-1)/11, (datetime(2017,m,1)-datetime(2017,1,1)).days/334) 
...  
'0.000 0.000' 
'0.091 0.093' 
'0.182 0.177' 
'0.273 0.269' 
'0.364 0.359' 
'0.455 0.452' 
'0.545 0.542' 
'0.636 0.635' 
'0.727 0.728' 
'0.818 0.817' 
'0.909 0.910' 
'1.000 1.000' 

這裏是情節。

Monthly ticks

相關問題