使用相同颜色绘制多条线,但使用"hue"来区分这些线。

4
我有这些数据,想要为每个观测值绘制一条 年龄 vs 预测概率 的线。
Age    Predicted Probability  Obs
18.0   0.206                  3.0
15.0   0.206                  3.0
34.0   0.154                  3.0
52.0   0.124                  3.0
46.0   0.146                  3.0
18.0   0.000                  2.0
15.0   0.000                  2.0
34.0   0.000                  2.0
52.0   0.098                  2.0
46.0   0.002                  2.0
18.0   0.000                  1.0
15.0   0.000                  1.0
34.0   0.004                  1.0
52.0   0.078                  1.0
46.0   0.006                  1.0
18.0   0.038                  0.0
15.0   0.032                  0.0
34.0   0.384                  0.0
52.0   0.318                  0.0
46.0   0.348                  0.0

我通过seaborn中的以下代码实现了这个功能:

sns.lineplot(data=df, x="Age", y="Predicted Probability", hue = 'Obs')       

使用hue参数,但我不想让每条线的颜色都不同。实际上,我想为每个观察值绘制一条黑线。我该怎么做?


1
这个回答解决了你的问题吗?https://dev59.com/sFMH5IYBdhLWcg3wwSPz - Camilo Martinez M.
不,它不会。我需要每个观测值的链接。 - Eisen
你的意思是不同行之间有不同的破折号,还是类似于这样的情况?@Eisen - Hussien Mostafa
2个回答

4

当设置了 hue 后,seaborn 会尝试使用不同的颜色绘制每条线。这些颜色是从调色板中选取的(在此情况下默认的调色板有10种不同的颜色)。

你可以创建自定义的调色板,例如从颜色列表中创建,甚至只需要一个元素的列表。因此,palette = sns.color_palette(['black'])

令人烦恼的是,seaborn 要求调色板中的颜色数量与 hue 值的数量完全相同。因此,必须将该数量作为参数提供 (palette = sns.color_palette(['black'], number_of_colors))。

这里有一些示例代码(已关闭默认图例,因为所有线条现在具有相同的颜色):

import seaborn as sns
import pandas as pd
from io import StringIO

data_str = '''Age    "Predicted Probability"  Obs
18.0   0.206                  3.0
15.0   0.206                  3.0
34.0   0.154                  3.0
52.0   0.124                  3.0
46.0   0.146                  3.0
18.0   0.000                  2.0
15.0   0.000                  2.0
34.0   0.000                  2.0
52.0   0.098                  2.0
46.0   0.002                  2.0
18.0   0.000                  1.0
15.0   0.000                  1.0
34.0   0.004                  1.0
52.0   0.078                  1.0
46.0   0.006                  1.0
18.0   0.038                  0.0
15.0   0.032                  0.0
34.0   0.384                  0.0
52.0   0.318                  0.0
46.0   0.348                  0.0
'''
df = pd.read_csv(StringIO(data_str), delim_whitespace=True)

palette = sns.color_palette(['black'], len(df['Obs'].unique()))
sns.lineplot(data=df, x="Age", y="Predicted Probability", hue='Obs', palette=palette, legend=False)

仅使用黑色的sns.lineplot

PS:一种不需要计数或手动分离色调的替代方法是创建一个只有一种颜色的ListedColormap

import seaborn as sns
from matplotlib.colors import ListedColormap

sns.lineplot(data=df, x="Age", y="Predicted Probability", hue='Obs', palette=ListedColormap(['black']), legend=False)

1

您可以通过色调虚线来改变线条的外观。

  1. 色调颜色取决于color_palette。

你可以在绘图之前使用 seaborn.set_palette 来设置自定义或预定义的任何调色板,当你在同一个图上绘制不同的数据时可以使用它们。 你可以从 seaborn 文档中查看更多示例和信息。你可以在文档中找到喜欢的颜色或者自己定义调色板。
seaborn.color_palette 对象可用于传递给 set_palette 函数。
# Create an array with the colors you want to use
colors = ["#FF0B04", "#4374B3"]# Set your custom color palette

sns.set_palette(sns.color_palette(colors))
#plot anything with hue ...first color takes category and so on 
sns.lineplot(data=df, x="Age", y="Predicted Probability", hue = 'Obs')       

你也可以使用这个有用的链接:如何在Seaborn中使用自己的颜色调色板,作者是Carolina Bento,发布于2019年8月22日,阅读时间为3分钟。
2. 你也可以使用破折号。

如果您不喜欢使用hue,也可以在lineplot函数中尝试dashes属性:

dashes:布尔值、列表或字典

确定如何为不同级别的样式变量绘制线条的对象。将其设置为True将使用默认划线代码,或者您可以传递划线代码列表或将样式变量的级别映射到划线代码的字典。将其设置为False将为所有子集使用实线。划痕的指定方式与matplotlib相同:一对(段,间隔)长度的元组,或空字符串以绘制实线。

sns.lineplot(x="Age", y="Predicted Probability",style='Obs',dashes=[(1,1),(5, 10)],data=df)

这篇文章可以帮助你修订大部分线图属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接