Seaborn调色板:如何选择居中的部分(例如,图的哪一端是红色,哪一端是蓝色)?

2024-10-04 05:20:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要一个熊猫数据帧的catplot,它包含一年中所有小时的数值。它有3列:小时、工作日和值。我的情节是这样的:

cat_weekdayhour = plt.figure(figsize=(12,12))
cat_weekdayhour = sns.set_context("paper")
cat_weekdayhour = sns.set(style="darkgrid", font_scale=.6)

weekdayhour.shape
cat_weekdayhour = sns.catplot(x="Weekday", y="Value", hue="Hour", kind="swarm", palette="coolwarm", data=dataframe)

这给了我下面的catplot,但是我不喜欢一天的凌晨(比如凌晨0点到4点)是蓝色的,而最后几个小时(晚上8点到11点)是红色的。相反,我想把红色的颜色集中到白天的时间然后让整个晚上的时间都是蓝色的。这能做到吗?谢谢您。在

enter image description here


Tags: 数据时间pltcat数值蓝色figure小时
3条回答

您正在使用dataframe中的Hour列作为着色源。相反,可以引入一个新列,其中包含从小时到12:00的值:

dataframe['Color'] = -abs(dataframe['Hour'] - 12)

所以12:00会变成0,24:00会变成-12。6: 00和18:00将变成-6。 这样,一天的中间部分将由最高值(红色→0)表示,而午夜将由最低值(蓝色→-12)表示。在

一个想法是创建一个新的colormap,我们称之为"cycliccoolwarm",它包含原始colormap和它的反向版本。然后使用这个新的颜色贴图和任何其他现有的颜色贴图一样简单。在

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

df = pd.DataFrame({"Day" : np.repeat(np.array(list("1234567")),24*40 ),
                   "Hour" : np.tile(np.arange(0,24), 7*40).astype(int),
                   "Value" : np.random.rand(7*24*40)*180})
df['Hour'] = df['Hour'].apply('{:02d}:00'.format)

cmap_orig = plt.get_cmap("coolwarm")
colors = cmap_orig(np.concatenate((np.linspace(0,1,128), np.linspace(1,0,128))))
cmap = ListedColormap(colors)
plt.cm.register_cmap("cycliccoolwarm", cmap=cmap)

g = sns.catplot(x="Day", y="Value", hue="Hour", kind="swarm", palette="cycliccoolwarm", data=df)

plt.show()

enter image description here

创建你自己的托盘结合“酷热”与它的反向托盘。我有一个旧版本的seaborn,所以我将使用swarmplot来说明

样本数据

import seaborn as sns
import numpy as np
import pandas as pd

n = 1000
np.random.seed(123)
df = pd.DataFrame({'Weekday': ['Friday']*n,
                   'Hour': np.random.randint(0,24,n),
                   'Value': np.random.randint(40,150,n)})

coolwarm调色板

^{pr2}$

enter image description here

自定义调色板

# 24 hours so split evenly between the two
mypal = sns.color_palette("coolwarm", 12) + sns.color_palette("coolwarm_r", 12)
sns.swarmplot(x="Weekday", y="Value", hue="Hour", palette=mypal, data=df)

enter image description here

相关问题 更多 >