Plotly: 如何在条形图上显示 "文本 "值的总和?

问题描述 投票:1回答:1

我正在创建一个条形图,在 Plotly Express 并想将图上显示的 "文本 "值相加。

我的数据如下。

import plotly.express as px
import pandas as pd
df = pd.DataFrame({'Make':['Mercedes', 'BMW', 'Mercedes', 'Mercedes', 'Chrysler', 'Chrysler', 'Chrysler', 'Chrysler', 'BMW', 'Chrysler', 'BMW', 'Mercedes', 'BMW', 'Mercedes'],
                          'Dimension':['Styling', 'Styling', 'Price', 'Styling', 'MPG', 'MPG', 'Styling', 'Styling', 'MPG', 'MPG', 'Price', 'Price', 'Styling', 'MPG'],
                          'Country':['USA', 'USA', 'USA', 'Germany', 'USA', 'USA', 'USA', 'England', 'Germany', 'USA', 'Germany', 'Poland', 'Italy', 'USA'],
                          'LowValue':['64', '61', '70', '65', '59', '68', '63', '57', '58', '55', '69', '63', '69', '61'],
                          'HighValue':['82', '95', '93', '95', '87', '93', '85', '85', '95', '92', '83', '87', '80', '80']})

我将这些数据绘制在 Plotly Express 使用下面的方法。

px.bar(df, x='Make', y='LowValue', color='Dimension', 
       barmode='group', text='LowValue')

如你所见 Styling 奔驰的条形图显示了两个值。 65和64(因为这些是基础数据点)。

问题:有没有办法将基础数据凝聚成一个值,并且只显示这个单一的加总值? 是否有办法将基础数据凝聚成一个单一的值,并且只显示这个单一的加总值?

例如,将129(基础数据点的总和)显示在最上面。Styling 奔驰的吧(而不是显示65和64)。

谢谢!我在Plotly Express中创建了一个条形图,想在图上显示 "文本 "值的总和。

plotly plotly-dash plotly-python
1个回答
1
投票

您可以使用 groupby() 作用于 pandas 来计算总数 LowValueMakeDimension 在创建条形图之前。我在下面附上了一个例子。

import plotly.express as px
import pandas as pd

df = pd.DataFrame({'Make': ['Mercedes', 'BMW', 'Mercedes', 'Mercedes', 'Chrysler', 'Chrysler', 'Chrysler', 'Chrysler', 'BMW', 'Chrysler', 'BMW', 'Mercedes', 'BMW', 'Mercedes'],
                   'Dimension': ['Styling', 'Styling', 'Price', 'Styling', 'MPG', 'MPG', 'Styling', 'Styling', 'MPG', 'MPG', 'Price', 'Price', 'Styling', 'MPG'],
                   'Country': ['USA', 'USA', 'USA', 'Germany', 'USA', 'USA', 'USA', 'England', 'Germany', 'USA', 'Germany', 'Poland', 'Italy', 'USA'],
                   'LowValue': ['64', '61', '70', '65', '59', '68', '63', '57', '58', '55', '69', '63', '69', '61'],
                   'HighValue': ['82', '95', '93', '95', '87', '93', '85', '85', '95', '92', '83', '87', '80', '80']})

df['LowValue'] = df['LowValue'].astype(int)

df1 = pd.DataFrame(df.groupby(by=['Make', 'Dimension'])['LowValue'].sum())

df1.reset_index(inplace=True)

fig = px.bar(df1, x='Make', y='LowValue', color='Dimension', barmode='group', text='LowValue')

fig.show()

enter image description here


0
投票

我想,只要你愿意修改你原来的df的方法是有的。

数据样本

import plotly.express as px
import numpy as np
import pandas as pd

df = pd.DataFrame({'Make':['Mercedes', 'BMW', 'Mercedes', 'Mercedes', 'Chrysler', 'Chrysler', 'Chrysler', 'Chrysler', 'BMW', 'Chrysler', 'BMW', 'Mercedes', 'BMW', 'Mercedes'],
                          'Dimension':['Styling', 'Styling', 'Price', 'Styling', 'MPG', 'MPG', 'Styling', 'Styling', 'MPG', 'MPG', 'Price', 'Price', 'Styling', 'MPG'],
                          'Country':['USA', 'USA', 'USA', 'Germany', 'USA', 'USA', 'USA', 'England', 'Germany', 'USA', 'Germany', 'Poland', 'Italy', 'USA'],
                          'LowValue':['64', '61', '70', '65', '59', '68', '63', '57', '58', '55', '69', '63', '69', '61'],
                          'HighValue':['82', '95', '93', '95', '87', '93', '85', '85', '95', '92', '83', '87', '80', '80']})

# we better use int here
df[["LowValue", "HighValue"]] = df[["LowValue", "HighValue"]].astype(int)

排列数据

现在,你想有金额为 LowValue 但由于你只想显示一个,你需要玩一下。

df["LowValueSum"] = df.groupby(["Make", "Dimension"])["LowValue"]\
                      .transform(sum)

# Here we consider the latest index within the goupby only 
df["idx_max"] = df.groupby(["Make", "Dimension"])["LowValueSum"]\
                  .transform(lambda x: x.index.max())

df.loc[df["idx_max"] != df.index, "LowValueSum"] = np.nan

# now you can eventually drop the previous colums
# df = df.drop("idx_max", axis=1)

情节

fig = px.bar(df, 
             x='Make', 
             y='LowValue',
             color='Dimension', 
             barmode='group',
             text='LowValueSum',
             hover_data={"Country":True,
                         "Dimension":False,
                         "Make":False},
             hover_name="Dimension")
fig.update_traces(textposition="outside")

enter image description here

更新 鉴于 182 看起来真的很接近上限范围,你最终可以添加这行。

fig.update_yaxes(range=[0, df["LowValueSum"].max() * 1.2])
© www.soinside.com 2019 - 2024. All rights reserved.