如何根据计数制作水平堆叠的直方图?
How to make a horizontal stacked histplot based on counts?
我有一个 df
,代表三个时间点 (1hr, 2hr and 3h
r) 的三个状态 (S1, S2, S3
)。我想显示状态的堆叠条形图,但堆叠是不连续的或至少不是累积的。我如何在 Seaborn
中解决这个问题?重要的是,时间在 y 轴上,状态在 x 轴上计数。
下面是一些代码。
data = [[3, 2, 18],[4, 13, 6], [1, 2, 20]]
df = pd.DataFrame(data, columns = ['S1', 'S2', 'S3'])
df = df.reset_index().rename(columns = {'index':'Time'})
melt = pd.melt(df, id_vars = 'Time')
plt.figure()
sns.histplot(data = melt,x = 'value', y = 'Time', bins = 3, hue = 'variable', multiple="stack")
编辑:
这在某种程度上是我正在寻找的,我希望这能给你一个想法。请忽略方框之间的刻度差异...
这在 seaborn 中非常困难,因为它本身不支持堆叠条。您可以使用 pandas 中的内置绘图,或尝试 plotly express。
data = [[3, 2, 18],[4, 13, 6], [1, 2, 20]]
df = pd.DataFrame(data, columns = ['S1', 'S2', 'S3'])
df = df.reset_index().rename(columns = {'index':'Time'})
# so your y starts at 1
df.Time+=1
melt = pd.melt(df, id_vars = 'Time')
# so y isn't treated as continuous
melt.Time = melt.Time.astype('str')
Pandas 可以做到,但是把标签放在那里有点痛苦。检查周围以找出如何做到这一点。
df.set_index('Time').plot(kind='barh', stacked=True)
Plotly 让事情变得更简单:
import plotly.express as px
px.bar(melt, x='value', y='Time', color='variable', orientation='h', text='value')
如果我没理解错的话,我想你想用value
作为权重:
sns.histplot(
data=melt, y='Time', hue='variable', weights='value',
multiple='stack', shrink=0.8, discrete=True,
)
我有一个 df
,代表三个时间点 (1hr, 2hr and 3h
r) 的三个状态 (S1, S2, S3
)。我想显示状态的堆叠条形图,但堆叠是不连续的或至少不是累积的。我如何在 Seaborn
中解决这个问题?重要的是,时间在 y 轴上,状态在 x 轴上计数。
下面是一些代码。
data = [[3, 2, 18],[4, 13, 6], [1, 2, 20]]
df = pd.DataFrame(data, columns = ['S1', 'S2', 'S3'])
df = df.reset_index().rename(columns = {'index':'Time'})
melt = pd.melt(df, id_vars = 'Time')
plt.figure()
sns.histplot(data = melt,x = 'value', y = 'Time', bins = 3, hue = 'variable', multiple="stack")
编辑: 这在某种程度上是我正在寻找的,我希望这能给你一个想法。请忽略方框之间的刻度差异...
这在 seaborn 中非常困难,因为它本身不支持堆叠条。您可以使用 pandas 中的内置绘图,或尝试 plotly express。
data = [[3, 2, 18],[4, 13, 6], [1, 2, 20]]
df = pd.DataFrame(data, columns = ['S1', 'S2', 'S3'])
df = df.reset_index().rename(columns = {'index':'Time'})
# so your y starts at 1
df.Time+=1
melt = pd.melt(df, id_vars = 'Time')
# so y isn't treated as continuous
melt.Time = melt.Time.astype('str')
Pandas 可以做到,但是把标签放在那里有点痛苦。检查周围以找出如何做到这一点。
df.set_index('Time').plot(kind='barh', stacked=True)
Plotly 让事情变得更简单:
import plotly.express as px
px.bar(melt, x='value', y='Time', color='variable', orientation='h', text='value')
如果我没理解错的话,我想你想用value
作为权重:
sns.histplot(
data=melt, y='Time', hue='variable', weights='value',
multiple='stack', shrink=0.8, discrete=True,
)