我有这些数据,我想为每个观测值绘制一条年龄与预测概率的线。
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')
使用色调参数。但我不希望每条线都有不同的颜色。事实上,我希望每个 Obs 都有一条黑线。我该怎么做?
答案 0 :(得分:1)
您可以通过色调或破折号
来更改线条的外观您可以在绘图之前使用 seaborn.set_palette
来设置自定义或任何预定义的调色板,这些调色板可以在您在同一绘图上绘制不同数据时使用。 can see more examples and info from seaborn doc
您可以在文档中找到首选颜色,或者可以定义您的调色板
seaborn.color_palette object used to pass to 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')
你也可以帮助How to use your own color palettes with Seaborn by Carolina Bento Aug 22, 2019·3 min read
如果您不喜欢使用 hue,也可以在 lineplot 函数中尝试这个 dashes 属性:
<块引用>破折号:布尔值、列表或字典
<块引用>对象决定如何为不同层次的画线画线 风格变量。设置为 True 将使用默认的破折号,或者您 可以传递破折号列表或字典映射级别 样式变量到破折号代码。设置为 False 将使用实线 对于所有子集。破折号在 matplotlib 中指定:一个元组 (segment, gap) 长度,或用空字符串绘制实线。
sns.lineplot(x="Age", y="Predicted Probability",style='Obs',dashes=[(1,1),(5, 10)],data=df)
this article can help you revise most of lineplot properties
答案 1 :(得分:1)
设置 hue
时,seaborn 想用不同的颜色绘制每条线。这些颜色是从调色板中选择的(在这种情况下,默认调色板有 10 种不同的颜色)。
您可以创建自定义调色板,例如从颜色列表中。甚至只有一个元素的列表。所以,palette = sns.color_palette(['black'])
。
令人烦恼的是,seaborn 坚持认为调色板具有与色调值完全相同的颜色数量。因此,该数字需要作为参数 (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)
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)