在 seaborn 点图中连接每个类别中的配对点
Posted
技术标签:
【中文标题】在 seaborn 点图中连接每个类别中的配对点【英文标题】:Join paired points within each category in seaborn pointplot 【发布时间】:2022-01-22 05:48:36 【问题描述】:我有一些按类别分组的数据(即“a”、“b”、“c”等),我想在每对内点之间画线每个类别。
基本上,每个类别都有一个“之前”和“之后”的值,所以我用色调来划分它。这是现在的情节,但最终我希望给定类别的每个“之前”和“之后”值都用一条线连接(即 a_before 连接到 a_after,b_before 连接到 b_after 等)。
sns.pointplot (x = ‘category’, y = ‘correlation’,
hue = ‘time’, linestyles = ‘’, dodge = .3, data = sample_data)
我将 linestyles 设置为 '' 因为否则它会连接所有点,而不仅仅是配对点。有没有办法用 seaborn 做到这一点?
谢谢!
编辑:我希望它看起来像这样:
(我将 linestyles 设置为 '' 因为否则它会连接所有点,而不仅仅是成对的点。)
【问题讨论】:
Seaborn 不知道配对。您至少需要告诉它哪些点与哪些点配对。这是相关的***.com/questions/70417004/… 您是否要在同一轴上创建两个图,一个连接所有“之前”点,另一个连接所有“之后”点?您是否尝试过运行基本的plot
两次?
@YuliaV 不完全——我想加入类别中的每一对点(a、b、c 等),而不是加入所有之前和之后的点。我已经编辑了我刚刚手动绘制的我希望能够绘制的线条的帖子。谢谢!!
我觉得用 matplotlib 做起来更容易,但不确定sns.pointplot
对于每一对,您需要运行类似:plt.plot(x=[x_before, x_after], y=[y_before, y_after])
有关plot
的更多信息,请参阅matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html
【参考方案1】:
Matplotlib 将生成的点存储到ax
的lines
字段中。
sns.pointplot()
总是生成(可能是空的)置信区间,这些区间也会存储到行中。同样的位置也存储在ax.collections
中。
您可以循环访问collections[0]
和collections[1]
以访问(躲避的)点的确切位置。然后,您可以在它们之间画线:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
sample_data = pd.DataFrame('category': ['a', 'a', 'b', 'b', 'c', 'c'],
'correlation': [0.33, 0.58, 0.51, 0.7, 0.49, 0.72],
'time': ['before', 'after', 'before', 'after', 'before', 'after'])
ax = sns.pointplot(x='category', y='correlation', hue='time', palette=['skyblue', 'dodgerblue'],
linestyles='', dodge=.3, data=sample_data)for (x0, y0), (x1, y1) in zip(ax.collections[0].get_offsets(), ax.collections[1].get_offsets()):
ax.plot([x0, x1], [y0, y1], color='black', ls=':', zorder=0)
ax.axhline(0, color='black', ls='--')
ax.set_ylim(-1, 1)
plt.show()
【讨论】:
以上是关于在 seaborn 点图中连接每个类别中的配对点的主要内容,如果未能解决你的问题,请参考以下文章