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

mar*_* s. 6 python matplotlib scatter-plot seaborn

我有一组存储在pandas数据帧中的数据.我正在尝试使用seaborn的pointplot()创建一个带有连接点的多系列散点图.每个系列都有不同的(x,y)值,它们在我的数据框中存储为浮点数.每行都有一个标签,区分每个系列.我正在使用Python 2.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)
Run Code Online (Sandbox Code Playgroud)

但是,这会导致一些奇怪的行为:

  • 正确识别颜色,但只连接了一些点
  • 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)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,所有点都被连接并且它们被适当地着色,但是再次,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')
Run Code Online (Sandbox Code Playgroud)

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

  • 所有系列中的所有x值均匀分布.注意,'x2'值与由'1'翻译的'x1'相同,并且它们在每个系列内以10的间隔隔开.我没想到这种行为.
  • x轴没有"干净"的外观尺度.它字面上标记每个点的相应x值.它正确标记了点,但没有适当地缩放它.似乎它将x值视为标签,类似于条形图的行为方式.
  • 这些点颜色正确,但没有连接点.

总结一下我的问题:

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

提前致谢.如果我能弄清楚如何从我的代码上传输出和绘图,我会更新我的问题.

我是stackoverflow的新手.我想通过发布我的代码生成的图来澄清我的问题,但我无法弄清楚这一点.关于如何做到这一点的任何指示也将非常感激,所以我可以更新问题.

编辑:事实证明,seaborn的点图使用x轴作为分类轴,这解释了我上面提到的奇怪行为.有没有办法手动将x轴行为从分类更改为数字?这似乎是最简单的方法,但我不熟悉python中的微调图.

小智 6

我有一个类似的问题,我终于使用Seaborn的FacetGrid解决了它.我使用plt.scatter作为点,使用plt.plot作为连接点的线.

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

时间序列图

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


mar*_* s. 5

在@mwaskom和这个问题的帮助下,我设法找到了我发布的问题的解决方案:

#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')
Run Code Online (Sandbox Code Playgroud)