python - seaborn 线图设置标记的透明度

标签 python seaborn

如何在seaborn.lineplot中分别设置标记和线条的透明度?

我有一组点,我想画一条连接所有点的线图。我希望线条比标记更透明。如何做到这一点?

这是我的目标:enter image description here

这是我的代码:

import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

matplotlib.rcParams['legend.handlelength'] = 0
matplotlib.rcParams['legend.numpoints'] = 1

data = [{'method': 'end-to-end', 'k': 1, 'time': 181.0, 'auc': 69.76}, {'method': 'end-to-end', 'k': 2, 'time': 193.0, 'auc': 71.12}, {'method': 'end-to-end', 'k': 3, 'time': 256.0, 'auc': 71.84}, {'method': 'end-to-end', 'k': 4, 'time': 302.0, 'auc': 71.87}, {'method': 'end-to-end', 'k': 5, 'time': 365.0, 'auc': 71.89}, {'method': 'end-to-end', 'k': 8, 'time': 602.0, 'auc': 71.87}, {'method': 'end-to-end', 'k': 10, 'time': 743.0, 'auc': 71.84}, {'method': 'first', 'k': 1, 'time': 82.0, 'auc': 69.01}, {'method': 'first', 'k': 2, 'time': 105.0, 'auc': 69.45}, {'method': 'first', 'k': 3, 'time': 171.0, 'auc': 70.11}, {'method': 'first', 'k': 4, 'time': 224.0, 'auc': 70.36}, {'method': 'first', 'k': 5, 'time': 279.0, 'auc': 70.74}, {'method': 'first', 'k': 8, 'time': 517.0, 'auc': 70.81}, {'method': 'first', 'k': 10, 'time': 654.0, 'auc': 70.98}]

data = pd.DataFrame(data)
g = sns.lineplot(x='time', y='auc', data=data, markers=['o','v'], markersize=7, sort=False, hue='method', style="method", dashes=False, linestyle=None)
plt.legend(loc='lower right')

最佳答案

Seaborn 似乎让颜色变浅了。您可以遍历生成的点并更改它们的亮度。 (这些点存储在 ax.collections 中。)亮度范围从 0(黑色)到 1(白色)。

由于现在点和线的颜色不同,并且线绘制在点之上,结果看起来有点奇怪。您可以更改行的 zorder 以将它们移到后面。

应再次创建图例(通过 ax.legend)以显示新的标记颜色。

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

sns.set_style('darkgrid')
flights = sns.load_dataset('flights')
## markers = [".",",","o","v","^","<",">","1","2","3","4","8","s","p","P","*","h","H","+","x","X","D","d","|","_",0,1,2,3,4,5,6,7,8,9,10,11]
markers = ["o", "v", "^", "<", ">", "8", "s", "*", "h", "H", "P", "p"]
ax = sns.pointplot(data=flights, x='year', y='passengers', hue='month', markers=markers, palette='Set3')
for dots in ax.collections:
    color = dots.get_facecolor()
    dots.set_color(sns.set_hls_values(color, l=0.5))
    dots.set_alpha(1)
for line in ax.lines:
    line.set_zorder(0)
ax.legend(bbox_to_anchor=(1.01, 1.02), loc='upper left')
plt.tight_layout()
plt.show()

sns.lineplot with darker marker colors

#更新

上面的答案是在您添加代码之前写的。对于代码中的示例,您可以调用 lineplot 两次。 (请注意,'axes level functions' 返回一个 ax,而 'figure level functions' 返回一个类似 seaborn 网格的数据结构,例如一个 FacetGrid。因此,自定义是只图级函数的返回值名称用g,轴级函数用类似ax的名称,这样更容易理解可以应用现有的示例代码。)

import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

matplotlib.rcParams['legend.handlelength'] = 0
matplotlib.rcParams['legend.numpoints'] = 1

data = [{'method': 'end-to-end', 'k': 1, 'time': 181.0, 'auc': 69.76}, {'method': 'end-to-end', 'k': 2, 'time': 193.0, 'auc': 71.12}, {'method': 'end-to-end', 'k': 3, 'time': 256.0, 'auc': 71.84}, {'method': 'end-to-end', 'k': 4, 'time': 302.0, 'auc': 71.87}, {'method': 'end-to-end', 'k': 5, 'time': 365.0, 'auc': 71.89}, {'method': 'end-to-end', 'k': 8, 'time': 602.0, 'auc': 71.87}, {'method': 'end-to-end', 'k': 10, 'time': 743.0, 'auc': 71.84}, {'method': 'first', 'k': 1, 'time': 82.0, 'auc': 69.01}, {'method': 'first', 'k': 2, 'time': 105.0, 'auc': 69.45}, {'method': 'first', 'k': 3, 'time': 171.0, 'auc': 70.11}, {'method': 'first', 'k': 4, 'time': 224.0, 'auc': 70.36}, {'method': 'first', 'k': 5, 'time': 279.0, 'auc': 70.74}, {'method': 'first', 'k': 8, 'time': 517.0, 'auc': 70.81}, {'method': 'first', 'k': 10, 'time': 654.0, 'auc': 70.98}]

data = pd.DataFrame(data)
sns.set_style('ticks')

ax = sns.lineplot(x='time', y='auc', data=data, markers=['o','v'], markersize=7, sort=False, hue='method', style='method',  dashes=False, linestyle='', alpha=1)
sns.lineplot(x='time', y='auc', data=data, sort=False, hue='method',   dashes=False,  alpha=0.3, legend=False, ax=ax)
ax.legend(loc='lower right')
plt.show()

two times sns.lineplot

关于python - seaborn 线图设置标记的透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69850854/

相关文章:

python - 正则表达式从日志文件中提取不需要的 IP 地址

python - 在 Python 中绘制两个正弦曲线的总和

python - Seaborn JointGrid 六边形图 : aspect ratio issue

python - django-admin - 如何修改 ModelAdmin 以一次创建多个对象?

python - drop发生在application外部时,如何获取drop target?

python - Django Pinax - 如何在其他项目(而不是克隆的 Pinax 项目)中使用应用程序?

python - 当放置在 models.py 外部时,Django 信号不起作用

python - Seaborn 热图,自定义刻度值

python - 用 seaborn 绘制不同色调但风格相同的点标记和线条

python - 如何从 kdeplot 获取半高全宽 (FWHM)