如何为Seaborn displot的不同hue类别指定Matplotlib样式参数?
给Seaborn直方图/KDE按hue类别单独设置样式
要实现给Normal类设置红色不透明、Uniform类设置alpha=0.5的效果,有两种实用方法:
方法一:分类别单独绘制(推荐)
直接针对每个类别调用Axes-level绘图函数,精准控制各自的样式参数,步骤清晰易维护:
import seaborn as sns import pandas as pd import numpy as np import matplotlib.pyplot as plt samples = 2**13 data = pd.DataFrame({'Values': list(np.random.normal(size=samples)) + list(np.random.uniform(size=samples)), 'Kind': ['Normal'] * samples + ['Uniform'] * samples}) # 创建画布与轴对象 fig, ax = plt.subplots() # 先画Uniform类,设置半透明 sns.histplot(data[data['Kind'] == 'Uniform'], x='Values', fill=True, alpha=0.5, label='Uniform', ax=ax) # 再画Normal类,设置红色完全不透明 sns.histplot(data[data['Kind'] == 'Normal'], x='Values', fill=True, color='red', alpha=1, label='Normal', ax=ax) # 添加图例 ax.legend() plt.show()
如果需要绘制KDE曲线,只需把histplot换成kdeplot即可,参数逻辑完全一致。
方法二:修改displot生成的元素
如果已经用displot生成了图,可以通过获取FacetGrid对象,遍历对应元素修改样式:
import seaborn as sns import pandas as pd import numpy as np samples = 2**13 data = pd.DataFrame({'Values': list(np.random.normal(size=samples)) + list(np.random.uniform(size=samples)), 'Kind': ['Normal'] * samples + ['Uniform'] * samples}) # 生成displot并获取FacetGrid实例 g = sns.displot(data, hue='Kind', x='Values', fill=True) # 针对直方图的柱子(patches)修改样式 for patch, label_text in zip(g.ax.patches, [t.get_text() for t in g.legend.get_texts()]): if label_text == 'Normal': patch.set_facecolor('red') patch.set_alpha(1) elif label_text == 'Uniform': patch.set_alpha(0.5) # 如果是KDE曲线,替换成以下代码遍历lines # for line, label_text in zip(g.ax.lines, [t.get_text() for t in g.legend.get_texts()]): # if label_text == 'Normal': # line.set_color('red') # line.set_alpha(1) # elif label_text == 'Uniform': # line.set_alpha(0.5) plt.show()
内容的提问来源于stack exchange,提问作者yujaiyu
相关产品推荐
相关产品推荐

