无法更改 Seaborn 情节中的线型

Not able to change linestyle in Seaborn plot

我有一个从 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()

然而,它们都只绘制实线:

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

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

请注意,线型(尚未)显示在图例中。参见例如issue 2005 or 。建议的解决方法是还设置不同的标记,这些标记会显示在图例中。或者通过 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()