我跟踪了我在2019年观看的所有电影,我想使用matplotlib,pyplot或seaborn在图表上表示年份。我看到一个用户的图表,该用户还跟踪了他一年内观看的电影:I want a graph like this.
我如何在时间轴上将每部电影表示为一个“事件”?
供参考,here是我的桌子。
谢谢
(对不起,如果是基本的话)
(根据您的评论,我已经假设您的date
列为str
类型。这是将产生图形的代码:
pd.DataFrame
对象首先是将列添加到数据框的函数:
def modify_dataframe(df):
""" Modify dataframe to include new columns """
df['Month'] = pd.to_datetime(df['Date']).dt.month
return df
pd.to_datetime
函数将序列df['Date']
转换为日期时间序列;并且我正在创建一个名为Month
的新列,该列等于月份号。
从此列,我们可以为您的绘图生成X
和Y
坐标。
def get_x_y(df):
""" Get X and Y coordinates; return tuple """
series = df['Month'].value_counts().sort_index()
new_series = s.reindex(range(1,13)).fillna(0).astype(int)
return new_series.index, new_series.values
这将使用修改后的数据框,并创建一个统计每个月出现次数的序列。然后,如果缺少任何月份,则fillna
用0
的值填充它们。现在您可以开始绘图了。
我创建了一个绘图,看起来像您链接的所需输出。
首先,调用您的函数:
df = modify_dataframe(df)
X, Y = get_x_y(df)
创建要在其上绘制的画布和轴。
fig = plt.figure(figsize=(12,5))
ax = fig.add_subplot(1, 1, 1, title='Films watched per month - 2019')
生成x标签。这将替换x轴上的当前月份int
值(即1、2、3 ...)。
xlabels = [datetime.datetime(2019, i, 1).strftime("%B") for i in list(range(1,13))]
ax.set_xticklabels(xlabels, rotation=45, ha='right')
设置x标记和x标签。
ax.set_xticks(range(1,13))
ax.set_xlabel('Month')
设置y轴,y-lim和y标签。
ax.set_yticks(range(0, max(s1.values)+2))
ax.set_ylim(0, max(s1.values)+1)
ax.set_ylabel('Count')
要获得所需的输出,请在图形下方填充一个方块色(我在这里选择了绿色,但是您可以将其更改为其他颜色)。
ax.fill_between(X, [0]*len(X), Y, facecolor='green')
ax.plot(X, Y, color="black", linewidth=3, marker="o")
绘制图形!
plt.show() # or plt.savefig('output.png', format='png')