如何在seaborn中显示所有数值图例的值

4
我正在尝试为以下数据框创建一个 `sns.lineplot()`。
overs:

    season  over    total_runs  total_overs avg_run
0   2008    1            703       745     0.943624
1   2008    2            923       741     1.245614
2   2008    3            826       727     1.136176
3   2008    4            912       725     1.257931
4   2008    5            1017      722     1.408587
235 2019    16           1099      721     1.524272
236 2019    17           1035      707     1.463932
237 2019    18           1124      695     1.617266
238 2019    19           1209      669     1.807175
239 2019    20           1189      552     2.153986
240 rows × 5 columns

sns.lineplot(x='avg_run', y='over', hue='season', data='overs')

我得到的输出如下:

Output

  • 我无法获得所有季节(范围:2008-2019)的图例,并且我无法区分当前的线图。
  • 请注意:我的要求是在同一张图中绘制所有线条。
1个回答

3
  • 尝试使用legend='full'参数来调用seaborn.lineplot()
    • 当图例值为数字时,这可能是必要的。
  • 有不同的调色板可供选择。
import pandas as pd
import numpy as np
import seaborn as sns

# test data
sample_length = range(1, 6+1)
rads = np.arange(0, 2*np.pi, 0.01)
data = np.array([np.sin(t*rads) for t in sample_length])
df = pd.DataFrame(data.T, index=pd.Series(rads.tolist(), name='radians'), columns=sample_length)

dfl = df.stack().reset_index().rename(columns={'level_1': 'frequency', 0: 'amplitude'})

# plot
sns.lineplot(x='radians', y='amplitude', hue='frequency', data=dfl, legend='full', palette='winter')

enter image description here

自定义色图

  • 选择一个包含足够独特颜色的调色板,以匹配图中线条的数量。
  • husl 调色板的其他选项可以在 seaborn.husl_palette 中找到。
  • colors 也可以是手动选择的颜色列表。
    • colors = ['red', 'blue', 'green', 'black', 'purple', 'yellow']
# create color mapping based on all unique values of frequency
freqs = dfl.frequency.unique()
colors = sns.color_palette('husl', n_colors=len(freqs))  # get a number of colors
cmap = dict(zip(freqs, colors))  # zip freqs to colors and create a dict

sns.lineplot(x='radians', y='amplitude', hue='frequency', data=dfl, legend='full', palette=cmap)

@PratyushSaxena 很好!我很高兴这解决了你的问题。 - Trenton McKinney
我需要更多帮助。我正在尝试将图例分成两列。但是图例的标题(季节)也随之移动了。我能否将标题固定在中心,而将图例值分成2列?谢谢... - Pratyush Saxena
1
@PratyushSaxena 我所知道的唯一多列的方法是使用 plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', ncol=2)。如果这不能解决问题,我建议你提出一个单独的问题。我没有太多处理自定义图例的经验。locanchor 可以采用其他值。图例 - Trenton McKinney

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