如何使用seaborn创建具有连接点的多系列散点图?

2024-03-29 02:14:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一组数据存储在pandas数据框中。我试图使用seaborn的pointplot()创建一个具有连接点的多系列散点图。每个序列都有不同的(x,y)值,它们以浮点形式存储在我的数据帧中。每一行都有一个标签,区分每个系列。我使用的是Python2.7、seaborn版本0.5.1和matplotlib版本1.4.3。

我所找到的一切都告诉我,我可以通过以下方式实现这一目标:

import matplotlib.pyplot as plt
import seaborn as sns

# Suppose my dataframe is called 'df', with columns 'x', 'y', and 'label'.
sns.pointplot(x = 'x', y = 'y', hue = 'label', data = df)

然而,这会导致一些奇怪的行为:

  • 颜色识别正确,但只有一些点相连
  • x轴上的数字重叠,似乎每个数据点都用它的值进行标记,而不是用适当的干净值进行缩放(似乎将x数据视为字符串/标签,而不是浮动)。

我试图通过将我的数据帧分割成碎片来解决这个问题。这不太理想,因为我可能有大约10+个序列要同时绘制,而且我不希望手动拆分数据:

df1 = df[df.test_type.values == "label 1"]
df2 = df[df.test_type.values == "label 2"]

ax = sns.pointplot(x = 'x',y='y', color = "blue", data = df1)
sns.pointplot(x = 'x', y = 'y', data = df2, color="red", ax = ax)

在这种情况下,所有的点都是连接的,并且它们的颜色都是适当的,但是同样,x轴显示出非常奇怪的行为。即使每个数据帧中的x值不同,绘图也会将它们对齐,使它们看起来相同。

现在,我不知道如何清晰地发布输出/绘图,但我的一些问题可以用以下方法重新创建:

#import the necessary modules
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

#Here is some sample data. The 'x2' data is slightly offset from 'x1'
x1 = range(0,100,10)
x2 = range(1,100,10)
x = x1+x2

#The y-values I generate here mimic the general shape of my actual data
y1 = x1[::-1]
y2 = [i+25 for i in x1[::-1]]
y = y1+y2

#Two levels of labels that will be applied to the data
z1 = ["1"]*10
z2 = ["2"]*10
z = z1+z2

#A pandas data frame from the above data
df = pd.DataFrame({'x': x, 'y': y, 'z': z})

#Pointplot using the above data
sns.pointplot(x = 'x', y = 'y', data = df, hue = 'z')

运行此代码会导致以下结果:

  • 所有系列中的所有x值的间距均均匀。注意,“x2”值与“x1”相同,由“1”转换,在每个序列中以10的间隔隔开。我没想到会有这种行为。
  • x轴没有“干净”的刻度。它字面上标记了每个点对应的x值。它正确地标记了点,但没有适当地缩放。它似乎把x值当作标签,类似于条形图的行为。
  • 点的颜色正确,但没有连接点。

总结我的问题:

是否有一种更简单/更好/更优雅的方法使用存储在pandas数据帧中的数据绘制多个连接点的系列散点图?Seaborn的pointplot看起来很理想,但它并没有像我预期的那样工作,我怀疑它可能会有一个不同于我需要完成的目标。我对其他可以实现这一目标的解决方案持开放态度(最好使用python)。

提前谢谢。如果我能找出如何从我的代码上传输出和绘图,我会更新我的问题。

我对stackoverflow完全陌生。我想通过发布由我的代码生成的图来澄清我的问题,但我无法理解这一点。关于如何做到这一点的任何建议都将非常感谢,这样我就可以更新问题了。

编辑:结果发现seaborn的pointplot使用x轴作为分类轴,这解释了我前面提到的奇怪行为。有没有办法手动将x轴行为从分类更改为数值?这似乎是最简单的方法,但我不太熟悉python中的微调图。


Tags: the数据importpandasdfdataas序列
2条回答

在@mwaskom和this question的帮助下,我找到了一个解决我发布的问题的方法:

#Assuming df is a pandas data frame with columns 'x', 'y', and 'label'
for key,grp in df.groupby('label'):
    plt.plot(grp.x,grp.y,'o-',label = key)
plt.legend(loc = 'best')

我也遇到过类似的问题,最后我用Seaborn的FacetGrid解决了它。我用plt.scatter表示点,plt.plt表示连接点的线。

g = sns.FacetGrid(df, hue="z", size=8)
g.map(plt.scatter, "x", "y")
g.map(plt.plot, "x", "y")

Time series plots

注意,这是在Seaborn版本0.6.0中完成的,而不是在版本0.5.1中。

相关问题 更多 >