提问人:goodLug 提问时间:10/29/2023 更新时间:10/29/2023 访问量:56
如何在具有多个 histplot 的 seaborn facetgrid 中为类别使用不同的颜色
How to use different colours for categories in seaborn facetgrid with multiple histplots
问:
我正在尝试在一排中绘制一长串直方图以寻找趋势。该数据是 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 轴,我稍后可以整理):
第二行代码确实有百分比,但颜色不可用
此外,奇怪的是,类别是相反的,因为每年它们都是左边的风太大,右边的风太小,但这可能可以以一种或另一种方式解决。
我尝试了许多设置变量的方式以及如何绘制它们,但没有奏效。
我还尝试将数据转换为长格式,但它变得太笨拙了。
任何关于我如何实现目标的指导/建议,非常感谢。
答: 暂无答案
评论