在boxplot或violinplot中绘制所有类别

时间:2017-11-02 19:27:35

标签: python pandas dataframe boxplot violin-plot

我有一个带有一些小提琴图的matplotlib图(虽然这个问题适用于任何类似的情节或其他数据框情况,而不仅仅是小提琴图)。我目前正在运行我的代码,它会吐出数字,每个类别都有一个小提琴图。代码如下所示:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame(data=np.random.random_integers(low=0,high=1000,size=(100,1)),
                  columns=['row0']
                  )

df['r0_range']='temp' #create a new column 'r0_range', give it a preliminary value
#make assignments depending on value of row0
df['r0_range'][df['row0']<=250]='[0,250]'
df['r0_range'][df['row0']>250]='(250,500]'
df['r0_range'][df['row0']>500]='(500,750]'
df['r0_range'][df['row0']>750]='(750,1000]'

fig1, ax1 = plt.subplots(1,1)

ax1 = sns.violinplot(data=df, x='r0_range', y='row0', inner=None, ax=ax1)

其中包含以下内容:

violin plots with four violins

我希望在我的图中包含第五个小提琴图,它代表所有类别中所有的数据。有没有一种优雅的方法可以做到这一点而无需将row0数据复制到数据帧的新行中?

1 个答案:

答案 0 :(得分:0)

也许这样的事情可以满足您的需求:

df = pd.DataFrame(data=np.random.randint(0, 1001, 100), columns=['row0'])
g = df.groupby(pd.cut(df['row0'], [0, 250, 500, 750, 1000]))
for name, data in g.groups.items():
    df[name] = df.loc[data]['row0']
sns.violinplot(data=df, inner=None, ax=ax1)

enter image description here