seaborn.kdeplot
的每个hue
组如何? , 或seaborn.displot
与kind='kde'
被赋予不同的linestyle
?- 轴级和图形级选项都将接受
linestyle/ls
的str
,它适用于所有hue
组。
- 轴级和图形级选项都将接受
import seaborn as sns
import matplotlib.pyplot as plt
# load sample data
iris = sns.load_dataset("iris")
# convert data to long form
im = iris.melt(id_vars='species')
# axes-level plot works with 1 linestyle
fig = plt.figure(figsize=(6, 5))
p1 = sns.kdeplot(data=im, x='value', hue='variable', fill=True, ls='-.')
# figure-level plot works with 1 linestyle
p2 = sns.displot(kind='kde', data=im, x='value', hue='variable', fill=True, ls='-.')
kdeplot
displot
评论问题
- How to set the line style for each kdeplot in a jointgrid不处理
hue
组。 - How to automatically alternate or cycle linestyles in seaborn regplot?不处理
hue
组并遍历每个独特的组。 - Dotted Seaborn distplot不处理
hue
组并遍历每个独特的组。 - change line style in seaborn facet grid
hue_kws
不是有效选项。
最佳答案
- 使用
fill=True
,要更新的对象位于.collections
- 使用
fill=False
,要更新的对象位于.lines
- 更新图例非常简单:
handles = p.legend_.legendHandles[::-1]
提取并反转图例句柄。它们被反转来更新,因为它们的顺序与情节linestyle
的更新顺序相反- 请注意,图级图使用
._legend
提取图例,轴级图使用.legend_
。
- 在
python 3.8.12
、matplotlib 3.4.3
、seaborn 0.11.2
中测试
kdeplot
:轴级
- 从
axes
对象中提取并遍历.collections
或.lines
并使用.set_linestyle
<
fill=True
fig = plt.figure(figsize=(6, 5))
p = sns.kdeplot(data=im, x='value', hue='variable', fill=True)
lss = [':', '--', '-.', '-']
handles = p.legend_.legendHandles[::-1]
for line, ls, handle in zip(p.collections, lss, handles):
line.set_linestyle(ls)
handle.set_ls(ls)
fill=False
fig = plt.figure(figsize=(6, 5))
p = sns.kdeplot(data=im, x='value', hue='variable')
lss = [':', '--', '-.', '-']
handles = p.legend_.legendHandles[::-1]
for line, ls, handle in zip(p.lines, lss, handles):
line.set_linestyle(ls)
handle.set_ls(ls)
displot
:图形级
- 类似于轴级图,但每个轴都必须迭代
- 图例
handles
可以在for line, ls, handle in zip(ax.collections, lss, handles)
中更新,但这会将更新应用于每个子图.因此,创建了一个单独的循环来仅更新图例handles
一次。
fill=True
g = sns.displot(kind='kde', data=im, col='variable', x='value', hue='species', fill=True, common_norm=False, facet_kws={'sharey': False})
axes = g.axes.flat
lss = [':', '--', '-.']
for ax in axes:
for line, ls in zip(ax.collections, lss):
line.set_linestyle(ls)
handles = g._legend.legendHandles[::-1]
for handle, ls in zip(handles, lss):
handle.set_ls(ls)
fill=False
g = sns.displot(kind='kde', data=im, col='variable', x='value', hue='species', common_norm=False, facet_kws={'sharey': False})
axes = g.axes.flat
lss = [':', '--', '-.']
for ax in axes:
for line, ls in zip(ax.lines, lss):
line.set_linestyle(ls)
handles = g._legend.legendHandles[::-1]
for handle, ls in zip(handles, lss):
handle.set_ls(ls)
关于python - 如何为 kdeplot/displot 中的每个色调组设置不同的线型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70089199/