Eis*_*sen 5 python pandas seaborn
我有这些数据,我想为每个观测值绘制一条年龄与预测概率的线。
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
Run Code Online (Sandbox Code Playgroud)
我通过seaborn中的以下代码完成了此操作:
sns.lineplot(data=df, x="Age", y="Predicted Probability", hue = 'Obs')
Run Code Online (Sandbox Code Playgroud)
使用色调参数。但我不希望每条线都有不同的颜色。事实上,我想要每个观察点都有一条黑线。我怎样才能做到这一点?
设置后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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)