0

我有一个从 iris 数据集修改的数据框,其中有 1 个数字列和 2 个分类列:

       PL     Species group
  4.400  versicolor     A
  1.600      setosa     B
  5.600   virginica     A
  4.700  versicolor     B
  6.100   virginica     B

我想用黑色线条和每个物种的不同线条样式绘制一个 seaborn 线图。我尝试了以下代码:

sns.pointplot(data=rnegdf, x='group', y='PL', hue='Species', 
         color='k', style='Species'); plt.show()
sns.pointplot(data=rnegdf, x='group', y='PL', hue='Species', 
         color='k', hue_kws=dict(ls=['-','-.','.'])); plt.show()
sns.pointplot(data=rnegdf, x='group', y='PL', hue='Species', 
         color='k', linestyle='Species'); plt.show()
sns.pointplot(data=rnegdf, x='group', y='PL', hue='Species', 
         color='k', linestyle='Species', style='Species'); plt.show()
sns.pointplot(data=rnegdf, x='group', y='PL', hue='Species', 
         color='k', linestyle='Species', style='Species', dashes='Species'); plt.show()

但是,它们都只绘制实线:

在此处输入图像描述

为什么我无法在此代码中更改线型?

4

1 回答 1

0

根据sns.pointplot()文档linestyles=(复数)可以为每个色调值提供线条样式。

请注意,线型(尚未)显示在图例中。参见例如issue 2005Seaborn 将线条样式设置为图例。建议的解决方法是设置不同的标记,这些标记确实显示在图例中。或者通过创建图例句柄ax.get_lines()

如果将更多元素绘制到同一个子图中,则创建图例的以下方法需要进行一些调整:

from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd
from io import StringIO

df_str = '''     PL     Species group
  4.400  versicolor     A
  1.600      setosa     B
  1.600      setosa     A
  5.600   virginica     A
  4.700  versicolor     B
  6.100   virginica     B'''
rnegdf = pd.read_csv(StringIO(df_str), delim_whitespace=True)

ax = sns.pointplot(data=rnegdf, x='group', y='PL', hue='Species', color='k',
                   linestyles=['-', '-.', ':'])
point_handles, labels = ax.get_legend_handles_labels()
ax.legend(handles=[(line_hand, point_hand) for line_hand, point_hand in zip(ax.lines[::3], point_handles)],
          labels=labels, title=ax.legend_.get_title().get_text(), handlelength=3)
plt.show()

带有线条样式的 sns.pointplot

于 2022-02-20T18:57:56.330 回答