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