matplotlib中基于离散判别器的绘图线
Posted
技术标签:
【中文标题】matplotlib中基于离散判别器的绘图线【英文标题】:Plot lines in matplotlib based on discrete discriminator 【发布时间】:2021-12-29 05:48:32 【问题描述】:我有 4 年的季节性数据,我想使用 matplotlib 在一张图上绘制。 我的数据在 pandas 数据框中,如下所示:
Total Year Day
5 2017 10/29
4 2016 10/30
3 2018 10/31
5 2019 10/31
10 2017 10/31
'Year'
和 'Day'
列的类型为 str
。 'Total'
列的类型为 int
。
我希望图表有 4 条线:每年一条线。我想要 Y 轴上的 'Total'
和 X 轴上的 'Day'
。我知道如何在 R 中使用 GGplot 做到这一点,但我无法在 Python 中使用 MatPlotLib。
【问题讨论】:
df['date'] = pd.to_datetime(df.Year.astype(str) + '-' + df.Day, format='%Y-%m/%d')
【参考方案1】:
首先,你要创建一个'Date'
列:
df['Month'] = df['Day'].apply(lambda x: x.split('/')[0])
df['Day'] = df['Day'].apply(lambda x: x.split('/')[1])
df['Date'] = '2020' + '-' + df['Month'] + '-' + df['Day']
df['Date'] = pd.to_datetime(df['Date'])
注意一个重要的事实:您希望不同年份沿相同的 x 轴绘制。为了达到这个结果,我需要在同一参考年报告来自不同年份的数据。作为参考年,我选择了2020
,因为它是闰年(所以它包含所有可能的日期,包括Feb 29
)。因此,'Date'
列将包含确切的日期和月份,但 2020
作为年份,对于每个数据框行。
这仅用于绘图目的。然后,您可以使用正确的格式 x 刻度沿 x 轴屏蔽年份值。
最后,您可以遍历一年并绘制数据:
fig, ax = plt.subplots()
for year in df['Year'].unique():
filt = df['Year'] == year
ax.plot(df[filt]['Date'], df[filt]['Total'], label = year)
ax.xaxis.set_major_locator(md.DayLocator(interval = 15))
ax.xaxis.set_major_formatter(md.DateFormatter('%m/%d'))
plt.setp(ax.xaxis.get_majorticklabels(), rotation = 90)
ax.legend(frameon = True)
ax.set_xlabel('Date')
ax.set_ylabel('Total')
plt.show()
完整代码
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as md
df = pd.read_csv(r'data\data.csv')
df['Month'] = df['Day'].apply(lambda x: x.split('/')[0])
df['Day'] = df['Day'].apply(lambda x: x.split('/')[1])
df['Date'] = '2020' + '-' + df['Month'] + '-' + df['Day']
df['Date'] = pd.to_datetime(df['Date'])
fig, ax = plt.subplots()
for year in df['Year'].unique():
filt = df['Year'] == year
ax.plot(df[filt]['Date'], df[filt]['Total'], label = year)
ax.xaxis.set_major_locator(md.DayLocator(interval = 15))
ax.xaxis.set_major_formatter(md.DateFormatter('%m/%d'))
plt.setp(ax.xaxis.get_majorticklabels(), rotation = 90)
ax.legend(frameon = True)
ax.set_xlabel('Date')
ax.set_ylabel('Total')
plt.show()
【讨论】:
以上是关于matplotlib中基于离散判别器的绘图线的主要内容,如果未能解决你的问题,请参考以下文章
Matplotlib 使用 AWS-EMR jupyter notebook 绘图