2015-12-09 3 views
0

Я пытаюсь построить данные временных рядов как точки в морском море, окрашенные по условию. я попробовал следующее:tsplot ошибка из-за границы в Python 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 2 из 3 условия имеют несколько наблюдений, но 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 предложил сделать обычный сюжет. делать это вручную сложно, это ошибка, и дубликаты работают, которые уже делают. у морского судна уже есть способ для построения и фасетных данных с помощью различных функций в dataframes, и я не хочу воспроизводить этот код. вот способ сделать вручную, что является громоздким:

# 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) 

в основном я ищу что-то вроде sns.pointplot, который использует числовой, а не категорическая ось х. у морского дна есть что-то вроде этого? другой способ подумать об этом как о версии с данными, поддерживающей dataframe, plt.scatter или plt.plot.

+1

В matplotlib 1.5, 'plt.scatter' и' plt.plot' являются [dataframe aware] (http://matplotlib.org/devdocs/users/whats_new.html#working-with-labeled-data-like- pandas-dataframes) – mwaskom

+0

Также ваши данные вряд ли будут работать с 'tsplot', даже если вы добавите больше временных точек, потому что ваши наблюдения не вложены в ваши единицы выборки. Это описано в [docs] (http://stanford.edu/~mwaskom/software/seaborn/generated/seaborn.tsplot.html) и [on stackoverflow] (http://stackoverflow.com/questions/22795348/ черчения-временные ряды-данные с-Сиборн/22798911 # 22798911). – mwaskom

ответ

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"]}) 

он должен построить просто отлично.

+0

некоторые временные ряды имеют только одно наблюдение за группу. если tsplot не может справиться с этим, как я могу получить график точек по условию, когда ось x интерпретируется численно, а не категорически, как в pointplot? есть ли другая функция? – lgd

+0

Просто нарисуйте обычный сюжет? Исходя из этого вопроса, вам просто нужны точки с двумя разными значениями переменной x. – mwaskom

+0

@mwaskom, но я хочу, чтобы морская птица автоматически покрасила их по условию, читая данные. Я не хочу делать это вручную с помощью '' plt.plot''.обычно временные ряды имеют более чем одно наблюдение за условием, но есть краевые случаи, когда есть только одно условие. – lgd

Смежные вопросы