1

首先,我认为提供一些关于我想做的事情的背景会很有帮助。我有一个时间序列数据集,它描述了一个地区的空气质量,具有小时分辨率。每一行都是一个观察值,每一列是一个不同的参数(例如温度、压力、颗粒物等)。我想在整个五年数据集中对一天中每个小时的观察值取平均值。但是,我首先需要区分夏季和冬季观察。这里有几行供参考:


            Date      Time  WSA  WSV  WDV  WSM   SGT   T2M  T10M  DELTA_T   PBAR  SRAD     RH  PM25         AQI
0     2015-01-01  00:00:00  0.9  0.2  334  3.2  70.9  29.2  29.1     -0.1  740.4     8  102.5  69.0  157.970495
1     2015-01-01  01:00:00  1.5  0.7  129  4.0  58.8  29.6  29.2     -0.4  740.2     8  102.5  23.5   74.974249
2     2015-01-01  02:00:00  0.8  0.8   70  2.7  18.0  28.7  28.3     -0.4  740.3     7  102.2  40.1  112.326633
3     2015-01-01  03:00:00  1.1  1.0   82  3.4  21.8  28.2  27.8     -0.4  740.1     6  102.0  31.1   90.957082
4     2015-01-01  04:00:00  1.0  0.8   65  4.7  34.3  27.3  27.2     -0.2  739.7     6  101.7  13.7   54.364807
...          ...       ...  ...  ...  ...  ...   ...   ...   ...      ...    ...   ...    ...   ...         ...
43175 2016-12-30  19:00:00  1.7  0.7  268  4.1  63.6  33.8  34.1      0.3  738.8     8  100.7  38.4  108.140704
43176 2016-12-30  20:00:00  1.5  0.1  169  3.3  77.5  33.2  33.7      0.5  738.7     9  101.0  27.2   82.755365

43177 2016-12-30  21:00:00  1.4  0.5  278  4.0  65.7  32.5  32.8      0.3  738.6     9  101.4  42.5  118.236181
43178 2016-12-30  22:00:00  2.8  2.7  277  6.5  16.7  33.2  33.3      0.1  738.6     9  101.6  25.2   78.549356
43179 2016-12-30  23:00:00  1.9  0.3  241  4.2  74.2  31.0  31.6      0.6  738.4     9  100.4  18.7   64.879828

[43180 rows x 15 columns]

我尝试根据季节将数据集分成两部分,并分别绘制。这可行,但我无法使情节显示为图例。

mask = (df['Date'].dt.month > 3) & (df['Date'].dt.month < 10)

summer = df[mask]
winter = df[~mask]

summer = summer.groupby(summer['Time'].dt.hour).mean().reset_index()
winter = winter.groupby(winter['Time'].dt.hour).mean().reset_index()

p = (
    ggplot(mapping=aes( x='Time', y='PM25')) +
    geom_point(data=summer, color='red')+
    geom_point(data=winter, color='blue')
    )

print(p)

使用单独的数据框进行绘图:[1]:https ://i.stack.imgur.com/W75kk.png

我做了更多的研究,并了解到 plotnine/ggplot 可以根据数据点的一个属性对数据点进行颜色编码。这种方法要求数据是单个数据集,所以我添加了一个指定季节的参数。但是,当我按小时分组时,会删除此“季节”属性。我认为这是因为你不能取非数字数据的平均值。因此,我发现自己有点自相矛盾。这是我尝试将数据保持在一起并添加“季节”列:

df.insert(0,'Season', 0)

summer = (df['Date'].dt.month > 3) & (df['Date'].dt.month < 10)

df['Season'] = df.where(summer, other='w')
df['Season'] = df.where(~summer, other='s')

df = df.groupby(df['Time'].dt.hour).mean()

print(df)

p = (
    ggplot(data = df, mapping=aes( x='Time', y='PM25', color='Season')) +
    geom_point()
    )

print(p)

当我尝试运行它时,它会引发以下问题,如果我检查数据框,所有非数字参数都已被删除:

plotnine.exceptions.PlotnineError: "Could not evaluate the 'color' mapping: 'Season' (original error: name 'Season' is not defined)" 

任何建议将不胜感激。

4

1 回答 1

0

提供的数据已保存到 airq.csv。除了季节栏外,还包括了小时栏。提供的代码已被使用。'Hour' 和 'Season' 必须在 groupby 函数中提供。提供了两种 plotnine.ggplot 可能性。拳头使用geom_point,第二个添加facet_wrap。每个案例都包含主题定制。

from plotnine import *
import pandas as pd

df = pd.read_csv('airq.csv', parse_dates=[0,1])
df.insert(0,'Season', 0)
summer = (df['Date'].dt.month > 3) & (df['Date'].dt.month < 9)
df['Season'] = df.where(summer, other='Winter')
df['Season'] = df.where(~summer, other='Summer')
df['Hour'] = df['Time'].dt.hour
df = df.groupby(['Hour', 'Season']).mean().reset_index()
custom_axis = theme(axis_text_x = element_text(color="grey", size=6, angle=90, hjust=.3),
                    axis_text_y = element_text(color="grey", size=6), 
                    plot_title = element_text(size = 25, face = "bold"), 
                    axis_title = element_text(size = 10)  
                    ) 
(
    ggplot(data = df, mapping = aes(x='Hour', y='PM25',
                          color='Season')) + geom_point() +
    custom_axis + ylab("Particulate matter 2.5 micrometres") + xlab("Hour") + labs(title="PM air quality report")
) 

geom_point 选项

custom_axis = theme(axis_text_x = element_text(color="grey", size=6, angle=90, hjust=.3),
                    axis_text_y = element_text(color="grey", size=6), 
                    plot_title = element_text(size = 25, face = "bold"), 
                    axis_title = element_text(size = 10), 
                    panel_spacing_y=.4, 
                    figure_size=(8, 4) 
                    ) 

(
    ggplot(data = df, mapping = aes(x='Hour', y='PM25')) + geom_point(alpha=1) + facet_wrap('Season') + 
    custom_axis + ylab("Particulate matter 2.5 micrometres") + xlab("Hour") + labs(title="PM air quality report")
)

facet_wrap 添加

于 2020-08-01T20:09:16.720 回答