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中基于离散判别器的绘图线的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像上的绘图线保存为 .mat 文件

Matplotlib 使用 AWS-EMR jupyter notebook 绘图

Matplotlib 绘图细节设置

使用 seaborn 和 matplotlib 对热图进行注释的绘图

Matplotlib.pyplot.plot 绘图

python3绘图示例6-1(基于matplotlib,绘图流程介绍及设置等)