我有一个dataframe,它包含两个列,id和value。每几行都有相同的id,但都有不同的值。我想要绘制一个boxen图,它显示了所有id的值的分布,以及从第一个id到当前的累积值的分布。这是一个简单的数据文件:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.DataFrame(columns=['id', 'value'])
for id in range(5):
df = pd.concat([df, pd.DataFrame({'id': [id]*10, 'value':np.random.rand(10)})]).reset_index(drop=True)这是:
plt.figure(figsize=(10, 5))
sns.boxenplot(x='id', y='value', data=df, width=0.4)
plt.show()只绘制每个id的值分布。我希望累积的id的分布接近每个id值。例如:
对于id=0,两者是相同的,在0和0.5时,我想要相同的框
对于id=1,在x=1中,我希望有一个用id==1表示值的框,而对于id==0或id==1的值,我希望在1.5处有一个方框
对于id=2,在x=2中,我希望有一个用id==2表示值的框,而在2.5个框中,用id==0、id==1或id==2表示值
诸若此类。
我找不到一种方法将不同大小的数据框放在一个地块中。
发布于 2022-07-13 16:02:36
有几种方法-
DataFrame
seaborn所期望的输入相匹配(复制数据,并将其插入单个seaborn中)。matplotlib功能,并使用更多的手动控制创建图表.海运-数据操作
实际上,我用相同的id存储不同标签“累积”和“非累积”下的重复数据。一旦我这样做,我就可以使用seaborn的接口来生成预期的绘图。
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
plt.rc('axes.spines', left=False, top=False, right=False)
rng = np.random.default_rng(0)
df = pd.DataFrame({
'id': np.arange(5).repeat(10),
'value': rng.random(5 * 10)
})
data = {}
cumul_groups = []
for id_, grp in df.groupby('id'):
cumul_groups.append(id_)
data[(id_, 'cumulative')] = df.loc[df['id'].isin(cumul_groups), 'value']
data[(id_, 'non-cumulative')] = grp['value']
ax = sns.boxenplot(x='id', y='value', hue='type', data=pd.concat(data, names=['id', 'type']).reset_index())
ax.legend(loc='lower left', bbox_to_anchor=(1, .5))

发布于 2022-07-13 15:29:17
用熊猫GroupBy()计算和
df = df.groupby('id').sum()
plt.figure(figsize=(10, 5))
sns.boxenplot(x=df.index, y=df.value, data=df, width=0.4)
plt.show()

https://stackoverflow.com/questions/72968525
复制相似问题