将x刻度更改为月和日

时间:2017-09-05 17:21:30

标签: python pandas matplotlib

我有一个问题继续我先前问过的问题,这次是关于如何更改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月份前十天的价值。我想绘制这些数据,所以我使用:

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天。什么是更简单/准确的方式?

1 个答案:

答案 0 :(得分:2)

假设我理解你,那并不太难。大部分动作都发生在熊猫之外。这似乎意味着设置刻度有相当大的自由度。

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