Python ViolinPlots

时间:2017-04-07 17:05:57

标签: python matplotlib seaborn

我目前正试图用this data set制作小提琴情节。

我希望x轴成为第一列(时间),以秒为单位。小提琴的左半部分是AskBidAvg而右半部分是GrpAvg 是否有一种不同于使用Hue的方法,因为从我看到它只需要一个具有2个唯一值的列。但是我们有很多不同的价值观。这是导致问题的原因。我们使用1分钟增量,我从总秒数()计算。无论是在seaborn还是matplotlib。 我正在使用的当前代码是:

sns.violinplot(x="Time",hue=["AskBidAvg", "GrpAvg"] ,inner ="quartiles" , linewidth= 1,split=True , data=df )

但是,它会抛出一个错误,即色调不能超过2个值。

1 个答案:

答案 0 :(得分:2)

为了绘制您想要的内容,您需要对数据进行一些转换。

你有时间列 - 一个没问题你的第二列应该保存y值(它将包含所有数值)然后应该有另一列告诉你它是AskBidAvg还是GrpAvg

    Time    variable    value
0   18000   AskBidAvg   -0.000019
1   18000   AskBidAvg   -0.000024
2   18000   AskBidAvg   0.000019
...     ...     ...     ...
76  18004   GrpAvg  -0.000019
77  18005   GrpAvg  -0.000005
78  18005   GrpAvg  -0.000012
79  18005   GrpAvg  0.000002

Pandas有一个很好的功能,可以为你做到这一点。

import pandas as pd
df = pd.read_csv("/Users/james.natale/Downloads/yourdata.csv",index_col=False,header=0)
df = pd.melt(df, id_vars=['Time'], value_vars=['AskBidAvg', 'GrpAvg'])

import seaborn as sns
sns.set(style="whitegrid", palette="pastel", color_codes=True)

# Draw a nested violinplot and split the violins for easier comparison
sns.violinplot(x=df['Time'], y=df['value'], hue=df['variable'], split=True,
               inner="quart")
sns.despine(left=True)