Python seaborn中的tsplot超出界限错误

时间:2015-12-09 15:48:06

标签: python matplotlib seaborn

我试图将时间序列数据绘制为seaborn中的点,按条件着色。我尝试了以下方法:

import matplotlib
import matplotlib.pylab as plt
import seaborn as sns
import pandas

df = pandas.DataFrame({"t": [0, 1],
                       "y": [1, 1],
                       "c": ["A", "B"]})
colors = {"A": "r", "B": "g"}
fig = plt.figure()
# this fails
sns.tsplot(time="t", value="y", condition="c", unit="c",
           data=df, err_style="unit_points", interpolate=False,
           color=colors)
plt.show()

错误是:

x_diff = x[1] - x[0]
IndexError: index 1 is out of bounds for axis 0 with size 1

但是如果我将数据绘制为:

# this works
sns.pointplot(x="t", y="y", hue="c", join=False, data=df)

然后它的工作原理。 pointplot将时间视为分类数据,但不适合此。如何使用tsplot完成此操作?它应该给出与pointplot相同的结果,除了x轴(t)应该像时间一样定量缩放而不是分类。

更新

此处有一个修订示例,即使大多数标签有多个观察结果,也会显示tsplot失败。在这个df中,3个条件中的2个有多个观察值,但是1个条件不足以导致错误:

df = pandas.DataFrame({"t": [0, 1.1, 2.9, 3.5, 4.5, 5.9],
                       "y": [1, 1, 1, 1, 1, 1],
                       "c": ["A", "A", "B", "B", "B", "C"]})
colors = {"A": "r", "B": "g", "C": "k"}
print df
fig = plt.figure()
# this works but time axis is wrong
#sns.pointplot(x="t", y="y", hue="c", join=False, data=df)

# this fails
sns.tsplot(time="t", value="y", condition="c", unit="c",
           data=df, err_style="unit_points", interpolate=False,
           color=colors)
plt.show()

@mwaskom建议制作普通情节。手动执行此操作非常容易出错,并且重复了seaborn已经完成的工作。 seaborn已经有了一种通过数据框中的各种功能绘制和分割数据的方法,我不想重现这段代码。这是一种繁琐的手动方式:

# solution using plt.subplot
# cumbersome and error prone solution
# the use of 'set' makes the order non-deterministic
for l in set(df["c"]):
    subset = df[df["c"] == l] 
    plt.plot(subset["t"], subset["y"], "o", color=colors[l], label=l)

基本上我正在寻找使用数字而不是分类x轴的sns.pointplot之类的东西。 seaborn有这样的东西吗?另一种思考方式是plt.scatterplt.plot的数据框架识别版本。

1 个答案:

答案 0 :(得分:0)

我认为问题实际上是你的观察太少了。 2个条件的2次观察意味着每种情况只有1次观察。对于时间序列图,这可能不会起作用。 x_diff = x[1] - x[0]计算时间间隔长度,并且每组只能进行一次观察。

如果每组观察次数超过1次,即:

df = pandas.DataFrame({"t": [0, 1, 2, 3],
                       "y": [1, 1, 2, 4],
                       "c": ["A", "B", "A", "B"]})

它的情节应该很好。