带有子集的多个饼图的绘图下拉列表

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

我是Python新手(一般编程)。我有 7 个相同的 dfs(保存值),对于每个 DFS,我都绘制了带有 4 个子集(每列 1 个)的索引(部门)饼图。每个 df 代表客户资料中每个部门的总支出。和地区。

我想在 Jupyter 笔记本中创建一个带有下拉菜单的图形,该下拉菜单允许我一次显示每个饼图(显然)。

mamp_subset:实际上有 21 行,但为了方便而缩短了......

中西部 东北 西
生产 4050720.6 3031984.8 5611374.9 4306556.0
牛奶鸡蛋 2408227.1 1813007.6 3294240.6 2595948.5
饮料 1097276.9 862985.1 1532102.1 1192854.9
冷冻 932023.9 680308.6 1263805.1 991491.6
食品储藏室 813371.3 597606.7 1100308.0 865809.8

我的代码:

myexplode = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1]
mywedge_props = {'linewidth' : 1, 'edgecolor' : 'black'}

# Create a figure and a set of subplots
fig1, axes = plt.subplots(2, 2, figsize=(12, 12))

def my_autopct(pct):
    return ('%1.2f%%' % pct) if pct > 5.5 else ''

# Plot each column of the dataframe as a pie chart
for i, column in enumerate(mamp_subset.columns):
    wedges, texts, autotexts = axes[i // 2, i % 2].pie(mamp_subset[column].sort_values(), 
                                           labels=mamp_subset.sort_values(by=[column], ascending=True).index, 
                                           autopct='%1.2f%%', 
                                           wedgeprops=mywedge_props, 
                                           explode=myexplode,  
                                           startangle=90)
    threshold = 6
    for label, pct_label in zip(texts, autotexts):
        pct_value = pct_label.get_text().rstrip('%')
        if float(pct_value) < threshold:
            label.set_text('')
            pct_label.set_text('')
            
    axes[i // 2, i % 2].set_title(column, fontsize='12', fontweight='bold')

# get current handles and labels
# this must be done AFTER plotting
current_handles, current_labels = plt.gca().get_legend_handles_labels()

# sort or reorder the labels and handles
reversed_handles = list(reversed(current_handles))
reversed_labels = list(reversed(current_labels))

# call plt.legend() with the new values
plt.legend(reversed_handles,reversed_labels, title='Departments', bbox_to_anchor=(1.5, 1.8)) 

fig1.suptitle('Middle Aged Married Parent', fontsize='20', fontweight='bold')

plt.show()  

结果: mamp_subset pie chart

我已经检查了处理类似问题的多个线程,并尝试使用回调、交互、更新菜单跟踪,但我不知道如何实现我已经编写的代码。

我还将所有 7 个 df 合并为 1 个更大的 df。是使用一个 df 还是多个 df 更好?我很茫然。

如有任何帮助,我们将不胜感激,谢谢!

python plotly subset dropdown pie-chart
1个回答
0
投票

以字典格式创建为数据框的每一列创建的饼图字典。确定初始显示区域并创建初始图形。接下来,使用字典中的图形数据添加图形。 添加后,分离第一个饼。最后,创建一个按钮菜单。此创建方法是根据此答案中的数据定制的。我在下拉菜单中稍微移动了位置。另外,plotly.express具有创建子图的功能,因此您可以轻松创建子图。

import pandas as pd
import io
import plotly.express as px

data = '''
    Midwest Northeast   South   West
produce 4050720.6   3031984.8   5611374.9   4306556.0
"dairy eggs"    2408227.1   1813007.6   3294240.6   2595948.5
beverages   1097276.9   862985.1    1532102.1   1192854.9
frozen  932023.9    680308.6    1263805.1   991491.6
pantry  813371.3    597606.7    1100308.0   865809.8
'''

df = pd.read_csv(io.StringIO(data), delim_whitespace=True)

figs = {col_name: px.pie(df[col_name], values=df[col_name], names=df.index) for col_name in df.columns}

first_region = df.columns[1]
fig = figs[first_region].update_traces(visible=True, pull=[0.1,0,0,0,0])
for k in figs.keys():
    if k != first_region:
        fig.add_traces(figs[k].data)
        fig.update_traces(pull=[0.1,0,0,0,0])
        
fig.update_layout(
    title='Middle Aged Marred Parent',
    updatemenus=[
        {
            "buttons": [
                {
                    "label": k,
                    "method": "update",
                    "args": [{"visible": [kk == k for kk in figs.keys()]}],
                }
                for k in figs.keys()
            ],
        "active": 0,
        "x": 0.0,
        "xanchor": "left",
        "y": 1.05,
        "yanchor": "top"
        }
    ]
)

fig.show()

plotly.express:方面图

df.reset_index(inplace=True)
df_long = df.melt(id_vars='index', value_vars=df.columns[1:], var_name='region')
df_long.head()
    index   region  value
0   produce Midwest 4050720.6
1   dairy eggs  Midwest 2408227.1
2   beverages   Midwest 1097276.9
3   frozen  Midwest 932023.9
4   pantry  Midwest 813371.3

fig = px.pie(df_long,
             values='value',
             names='index',
             facet_col='region',
             facet_col_wrap=2,
             facet_row_spacing=0.1,
             facet_col_spacing=0.1,
             title='Middle Aged Marred Parent',
             hover_data=['value'],
            )
fig.update_traces(textposition='inside', textinfo='percent+label', pull=[0.1,0,0,0,0])
fig.update_layout(width=800, height=800)
fig.show()

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