无法更改 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()
docs,linestyles=
(复数)可以为每个色调值提供一种线条样式。
请注意,线型(尚未)显示在图例中。参见例如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()
我有一个从 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()
docs,linestyles=
(复数)可以为每个色调值提供一种线条样式。
请注意,线型(尚未)显示在图例中。参见例如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()