在绘图中将计数百分比添加到堆叠条形图中

问题描述 投票:0回答:3

给出以下用plotly 创建的图表。

我想添加每个块内 M 和 F 类别的每个计数的百分比值。

用于生成此图的代码。

arr = np.array([
        ['Dog', 'M'], ['Dog', 'M'], ['Dog', 'F'], ['Dog', 'F'],
        ['Cat', 'F'], ['Cat', 'F'], ['Cat', 'F'], ['Cat', 'M'],
        ['Fox', 'M'], ['Fox', 'M'], ['Fox', 'M'], ['Fox', 'F'],
        ['Dog', 'F'], ['Dog', 'F'], ['Cat', 'F'], ['Dog', 'M']
    ])

df = pd.DataFrame(arr, columns=['A', 'G'])

fig = px.histogram(df, x="A", color='G', barmode="stack")
fig.update_layout(height=400, width=800)

fig.show()
python plotly data-visualization plotly-dash plotly-python
3个回答
15
投票

据我所知,Plotly 中的直方图没有文本属性。但您可以自己生成条形图,然后通过文本属性添加百分比。

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

arr = np.array([
        ['Dog', 'M'], ['Dog', 'M'], ['Dog', 'F'], ['Dog', 'F'],
        ['Cat', 'F'], ['Cat', 'F'], ['Cat', 'F'], ['Cat', 'M'],
        ['Fox', 'M'], ['Fox', 'M'], ['Fox', 'M'], ['Fox', 'F'],
        ['Dog', 'F'], ['Dog', 'F'], ['Cat', 'F'], ['Dog', 'M']
    ])

df = pd.DataFrame(arr, columns=['A', 'G'])

df_g = df.groupby(['A', 'G']).size().reset_index()
df_g['percentage'] = df.groupby(['A', 'G']).size().groupby(level=0).apply(lambda x: 100 * x / float(x.sum())).values
df_g.columns = ['A', 'G', 'Counts', 'Percentage']

px.bar(df_g, x='A', y=['Counts'], color='G', text=df_g['Percentage'].apply(lambda x: '{0:1.2f}%'.format(x)))


7
投票

请注意,您现在可以指定绘图

barnorm
text_auto
参数来实现此目的。看看你的例子:

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

# Data
arr = np.array([
    ['Dog', 'M'], ['Dog', 'M'], ['Dog', 'F'], ['Dog', 'F'],
    ['Cat', 'F'], ['Cat', 'F'], ['Cat', 'F'], ['Cat', 'M'],
    ['Fox', 'M'], ['Fox', 'M'], ['Fox', 'M'], ['Fox', 'F'],
    ['Dog', 'F'], ['Dog', 'F'], ['Cat', 'F'], ['Dog', 'M']
])

df = pd.DataFrame(arr, columns=['A', 'G'])

#Plotly Code
fig = go.Figure()

fig = px.histogram (  df,
                      x="A",
                      color="G",
                      barnorm = "percent",
                      text_auto= True,
                      color_discrete_sequence=["mediumvioletred", "seagreen"],
                ) \
        .update_layout (

                    title={
                            "text": "Percent :A - G",
                            "x": 0.5
                          },

                    yaxis_title="Percent"
                ) \
        .update_xaxes(categoryorder='total descending')

fig.show()

一般来说,与自己计算百分比相比,它应该是首选解决方案。这里的输出:


0
投票

您还可以使用 px.bar() 中的文本参数为每个栏指定自定义文本标签。如果您想将值显示为百分比,可以使用 str.format() 方法来格式化文本标签。

topCom = df["Make"].value_counts().sort_values(ascending=False).head(10)
px.bar(x= topCom.index ,y= topCom/742*100,
text=[f"{value:.2f}%" for value in topCom/742*100],
color_discrete_sequence=['#4C4C6D'])

Top 10 Companies with Maximum Number of vehicle production

© www.soinside.com 2019 - 2024. All rights reserved.