基于离散鉴别器在 matplotlib 中绘制线条
Plot lines in matplotlib based on discrete discriminator
我有 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 弄明白
首先,您必须创建一个 '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 轴的年份值。
最后,您可以遍历 year 并绘制数据:
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()
我有 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.
首先,您必须创建一个 '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 轴的年份值。
最后,您可以遍历 year 并绘制数据:
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()