如何在具有多个 histplot 的 seaborn facetgrid 中为类别使用不同的颜色

How to use different colours for categories in seaborn facetgrid with multiple histplots

提问人:goodLug 提问时间:10/29/2023 更新时间:10/29/2023 访问量:56

问:

我正在尝试在一排中绘制一长串直方图以寻找趋势。该数据是 1980 年至 2022 年每年 7 月某个位置的每小时风速。原始数据是以节为单位的风速,但我根据以节为单位的速度将其分为“风力太小”、“航行风力好”和“风力太大”。由于前几个月有一些缺失值,我希望直方图显示百分比,而不是计数,以便可以直接在子图表中比较它们。我正在使用 seaborn,因为它似乎是根据数据中的变量获取多图表网格图的最干净的方法,其中每个单独的图,实际上它执行“分组依据”而不调用它。

因为整个图表很忙,所以我想挑选出 3 个风力强度类别中的每一个,以便眼睛更容易关注特定类别,这个想法是用这张图表来获得“全局概览”。我的代码,我希望可以理解的逻辑,如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv(r'E:\Weather Data\years 1980 - 2022 - months 07.csv')
df = df.dropna(subset=['ws'])
df['yrMo'] = df.A.str[:7]

##Logic for wind speed bands
##Too little wind: calm to mid F3 (7-10knts)  = 0 to 8.9
##Good sailing breeze: mid F3 to mid F5 (at which point gusts of F6 become likely)  = 9 to 19.9
##Too much wind: mid F5 (17-21knts) and above = 20 and above

conditions = [
    (df['ws'] >= 0) & (df['ws'] < 9),
    (df['ws'] >= 9) & (df['ws'] < 20),
    (df['ws'] >= 20)
    ]

values = ['Too little wind', 'Good sailing breeze', 'Too much wind']

df['windCat'] = np.select(conditions, values)

###fg = sns.FacetGrid(df, col="yrMo", hue='windCat', height=6) ##get colours but lose %
###fg = sns.FacetGrid(df, col="yrMo", height=6,)  ##get % but lose colours
fg.map(sns.histplot, 'windCat', stat='percent', common_bins=False, common_norm=False)
fg.set_titles('{col_name[0]}{col_name[1]}{col_name[2]}{col_name[3]}', pad=-10)

plt.show()

np.select 语句后的数据框如下所示

       Unnamed: 0                    A      J     K     wd    ws     yrMo              windCat
0            4649  1980-07-01 00:00:00  320.0  26.0  320.0  26.0  1980-07        Too much wind
1            4650  1980-07-01 01:00:00  320.0  22.0  320.0  22.0  1980-07        Too much wind
2            4651  1980-07-01 02:00:00  330.0  22.0  330.0  22.0  1980-07        Too much wind
3            4652  1980-07-01 03:00:00  290.0  20.0  290.0  20.0  1980-07        Too much wind
4            4653  1980-07-01 04:00:00  330.0  24.0  330.0  24.0  1980-07        Too much wind
5            4654  1980-07-01 05:00:00  340.0  22.0  340.0  22.0  1980-07        Too much wind
6            4655  1980-07-01 06:00:00  330.0  25.0  330.0  25.0  1980-07        Too much wind
7            4656  1980-07-01 07:00:00  330.0  25.0  330.0  25.0  1980-07        Too much wind
8            4657  1980-07-01 08:00:00  330.0  25.0  330.0  25.0  1980-07        Too much wind
9            4658  1980-07-01 09:00:00  320.0  21.0  320.0  21.0  1980-07        Too much wind
10           4659  1980-07-01 10:00:00  320.0  21.0  320.0  21.0  1980-07        Too much wind
11           4660  1980-07-01 11:00:00  320.0  20.0  320.0  20.0  1980-07        Too much wind
12           4661  1980-07-01 12:00:00  320.0  21.0  320.0  21.0  1980-07        Too much wind
13           4662  1980-07-01 13:00:00  320.0  19.0  320.0  19.0  1980-07  Good sailing breeze
14           4663  1980-07-01 14:00:00  330.0  19.0  330.0  19.0  1980-07  Good sailing breeze
15           4664  1980-07-01 15:00:00  320.0  18.0  320.0  18.0  1980-07  Good sailing breeze
16           4665  1980-07-01 16:00:00  300.0  16.0  300.0  16.0  1980-07  Good sailing breeze
etc etc

以 ###fg 开头的两行(在进行更改后,我一次取消注释一行以进行测试)表示代码接近,但两者都存在重大缺陷。第一个确实得到了不同的颜色,但百分比显示会爆炸,都是 100%(虽然它确实适用于计数,但由于缺少值,它们在视觉上具有误导性,请忽略凌乱的 X 轴,我稍后可以整理):

颜色但百分比丢失

第二行代码确实有百分比,但颜色不可用

百分比,但颜色会丢失

此外,奇怪的是,类别是相反的,因为每年它们都是左边的风太大,右边的风太小,但这可能可以以一种或另一种方式解决。

我尝试了许多设置变量的方式以及如何绘制它们,但没有奏效。

我还尝试将数据转换为长格式,但它变得太笨拙了。

任何关于我如何实现目标的指导/建议,非常感谢。

颜色 Seaborn 直方图 小面网格

评论


答: 暂无答案