Plotly:如何对条形图上显示的 "text" 值求和?
Plotly: how to sum the "text" values displayed on a bar chart?
我正在 Plotly Express
中创建条形图,并想对绘图上显示的 "text" 值求和。
我的数据如下:
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(因为它们是基础数据点)。
问题:有没有办法将基础数据合并为一个值并只显示该单个汇总值?
例如,在梅赛德斯 Styling
栏的顶部显示 129(基础数据点的总和)(而不是显示 65 和 64)。
谢谢!
在创建条形图之前,您可以使用 pandas groupby()
计算 Make
和 Dimension
的总数 LowValue
:
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()
我猜是有办法的,只要你愿意修改你原来的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")
更新 鉴于 182
看起来非常接近上限,您最终可以添加此行
fig.update_yaxes(range=[0, df["LowValueSum"].max() * 1.2])
我正在 Plotly Express
中创建条形图,并想对绘图上显示的 "text" 值求和。
我的数据如下:
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(因为它们是基础数据点)。
问题:有没有办法将基础数据合并为一个值并只显示该单个汇总值?
例如,在梅赛德斯 Styling
栏的顶部显示 129(基础数据点的总和)(而不是显示 65 和 64)。
谢谢!
在创建条形图之前,您可以使用 pandas groupby()
计算 Make
和 Dimension
的总数 LowValue
:
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()
我猜是有办法的,只要你愿意修改你原来的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")
更新 鉴于 182
看起来非常接近上限,您最终可以添加此行
fig.update_yaxes(range=[0, df["LowValueSum"].max() * 1.2])