Plotly:如何创建包含下拉菜单的多面条形图?

Plotly: How to create faceted bar plots including a dropdown menu?

我有以下数据框

import pandas as pd
df = pd.DataFrame({'var1':[0.2, 0.3, 0.4, 0.5, 0.6], 'var2': [1.2, 1.3, 1.4, 1.5, 1.6],
                   'facet_var': ['sd_1', 'sd_1', 'ctrl_1', 'ctrl_1', 'ctrl_1'],
                   'value_facet': ['a', 'b', 'a','b','c']})

我想创建一个 htmlbarplotsvar1var2(从下拉菜单中选择)由 facet_var 分面。条形图的 x_values 将是 value_facetbarplotsheight 将是 var1var2,具体取决于从下拉菜单

有什么想法可以使用 plotly 做类似的事情吗?

你问的很可能是完全可行的,但你的问题中有很多令人困惑的元素。问题标题说 Histogram,但您在问题本身中谈论的是 barplots。那么没有装箱吗?此外,术语 facets 最适合 plotly.express (px)px 最适合长格式的数据。并且您提供了一个格式更宽的数据集,因为您有包含 var1var2:

的单个类别值的列
    var1    var2    facet_var   value_facet
0   0.2     1.2     sd_1        a
1   0.3     1.3     sd_1        b
2   0.4     1.4     ctrl_1      a
3   0.5     1.5     ctrl_1      b
4   0.6     1.6     ctrl_1      c

这种格式通常更适合 plotly.graph_objects (go)。在那种情况下,我们更有可能谈论 subplots 而不是 facets。还有一件事。数据集中的维数并不能真正证明多面条形图的合理性。这意味着您的数据集的所有维度都将使用像这样的分组和分面条形图完全可视化 px.bar(df, x='value_facet', y='value', color='variable', facet_col='facet_var'):

绘图 1: 所有数据维度,但没有 drop-down

但为了回答您的问题,假设您不喜欢使用直方图(具有分箱值),而是使用带有下拉菜单的 条形图,下面的代码片段将为下拉菜单中的选项 var1var2 生成以下图:

情节 2: var1

情节 3: var2

下面完整代码片段中特别重要的一行是:

df=pd.melt(df, id_vars=['facet_var', 'value_facet'], value_vars=['var1', 'var2'])

这会将您提供的 semi-wide 格式的数据集转换为更适合 px:

的长格式数据
    facet_var   value_facet variable    value
0   sd_1        a           var1    0.2
1   sd_1        b           var1    0.3
2   ctrl_1      a           var1    0.4
3   ctrl_1      b           var1    0.5
4   ctrl_1      c           var1    0.6
5   sd_1        a           var2    1.2
6   sd_1        b           var2    1.3
7   ctrl_1      a           var2    1.4
8   ctrl_1      b           var2    1.5
9   ctrl_1      c           var2    1.6

完整代码:

import plotly.express as px
import plotly.graph_objects as go
import pandas as pd

df = pd.DataFrame({'var1':[0.2, 0.3, 0.4, 0.5, 0.6], 'var2': [1.2, 1.3, 1.4, 1.5, 1.6],
                   'facet_var': ['sd_1', 'sd_1', 'ctrl_1', 'ctrl_1', 'ctrl_1'],
                   'value_facet': ['a', 'b', 'a','b','c']})

df=pd.melt(df, id_vars=['facet_var', 'value_facet'], value_vars=['var1', 'var2'])

df1=df[df['variable']=='var1']
df2=df[df['variable']=='var2']

### all dimensions, no drop-downs  ###################################################
# PLot 1
#fig = px.bar(df, x='value_facet', y='value', color='variable', facet_col='facet_var')
#fig.show()
######################################################################################

# Figure with dropdown menu to produce plot 2 and plot 3
fig = px.bar(df1, x='value_facet', y='value', color='variable', facet_col='facet_var')


updatemenus = [
    {
        'buttons': [
            {
                'method': 'update',
                'label': 'var 1',
                'args': [
                    {'y': [df1[(df1['facet_var'] == 'sd_1')]['value'],
                           df1[(df1['facet_var'] == 'ctrl_1')]['value']]},
                ]
            },
            {
                'method': 'update',
                'label': 'var 2',
                'args': [
                    {'y': [df2[(df2['facet_var'] == 'sd_1')]['value'],
                           df2[(df2['facet_var'] == 'ctrl_1')]['value']]},
                ]
            }
        ],
        'direction': 'down',
        'showactive': True,
    }
]

fig.update_layout(updatemenus=updatemenus)
fig.show()