Plotly Sunburst Chart (Python) - make_subplots 的“specs”参数必须是具有维度 (1 x 1) 的二维字典列表

Posted

技术标签:

【中文标题】Plotly Sunburst Chart (Python) - make_subplots 的“specs”参数必须是具有维度 (1 x 1) 的二维字典列表【英文标题】:Plotly Sunburst Chart (Python) - 'specs' argument to make_subplots must be a 2D list of dictionaries with dimensions (1 x 1) 【发布时间】:2021-09-23 14:16:35 【问题描述】:

我正在使用 python Plotly(版本 5.1.0)构建一个 Sunburst 图表。

我一直在关注这里的教程:

https://plotly.com/python/sunburst-charts/#sunburst-chart-with-a-continuous-colorscale

具体来说,我正在尝试复制底部标题为“具有连续色阶的旭日图”的最后一个示例。

当我在本地运行它时,一切正常。但是,当我尝试将其部署到我的服务器时,以下代码行会产生错误。

fig = make_subplots(1, 1, specs=[["type": "domain", "type": "domain"]],)

我得到以下 ValueError:

The 'specs' argument to make_subplots must be a 2D list of dictionaries with 
dimensions (1 x 1).

Received value of type <class 'list'>: [['type': 'domain', 'type': 'domain']]

我不确定为什么会收到此错误,因为我正在使用相同数据结构的示例。在本地它工作得很好。我不确定这是否是导入问题、库冲突等。

这是我的代码。

from plotly import graph_objs as go
from plotly.tools import make_subplots
import pandas as pd

df = pd.read_csv('../sunburst_pd.csv')

levels = ['PD', 'State', 'Region'] 
color_columns = ['BP', 'Black']
value_column = 'BP'

def build_hierarchical_dataframe(df, levels, value_column, color_columns=None):
    df_all_trees = pd.DataFrame(columns=['id', 'parent', 'value', 'color'])
    for i, level in enumerate(levels):
        df_tree = pd.DataFrame(columns=['id', 'parent', 'value', 'color'])
        dfg = df.groupby(levels[i:]).sum()
        dfg = dfg.reset_index()
        df_tree['id'] = dfg[level].copy()
        if i < len(levels) - 1:
            df_tree['parent'] = dfg[levels[i+1]].copy()
        else:
            df_tree['parent'] = 'total'
        df_tree['value'] = dfg[value_column]
        df_tree['color'] = dfg[color_columns[0]] / dfg[color_columns[1]]
        df_all_trees = df_all_trees.append(df_tree, ignore_index=True)
    total = pd.Series(dict(id='total', parent='',
                              value=df[value_column].sum(),
                              color=df[color_columns[0]].sum() / 
                              df[color_columns[1]].sum()))
    df_all_trees = df_all_trees.append(total, ignore_index=True)
    return df_all_trees

df_all_trees = build_hierarchical_dataframe(df, levels, value_column, 
    color_columns)
average_score = df['BP'].sum() / df['Black'].sum()

fig = make_subplots(1, 2, specs=[["type": "domain", "type": "domain"]],)

fig.add_trace(go.Sunburst(
    labels=df_all_trees['id'],
    parents=df_all_trees['parent'],
    values=df_all_trees['value'],
    branchvalues='total',
    marker=dict(
        colors=df_all_trees['color'],
        colorscale='RdBu',
        cmid=average_score),
    hovertemplate='<b>%label </b> <br> BP: %value<br> 
        BP Population: %. color:.6f',
    name=''
    ), 1, 1)

fig.add_trace(go.Sunburst(
    labels=df_all_trees['id'],
    parents=df_all_trees['parent'],
    values=df_all_trees['value'],
    branchvalues='total',
    marker=dict(
        colors=df_all_trees['color'],
        colorscale='RdBu',
        cmid=average_score),
    hovertemplate='<b>%label </b> <br> BP: %value<br> 
        BP Population: %color:.6f',
    maxdepth=2
    ), 1, 2)

fig.update_layout(margin=dict(t=10, b=10, r=10, l=10))

fig.show()

这是我的数据快照:

Region. |. State. | PD. |. BP.  |.  Black

South. |.Florida. |. FL. |. 3.  |. 1500
North. | New York. |.NY. |. 7. |.  1275

任何帮助将不胜感激。

【问题讨论】:

我无法运行您的示例代码,因为显然我无权访问您的文件系统...我希望它对我来说确实失败了fig = make_subplots(1, 1, specs=[["type": "domain", "type": "domain"]],),因为您要求 1 col, 1行并传递一个 1x2 囊列表... @RobRaymond 感谢您的回复。我相信这是问题所在,但我不太确定如何重构...... 您是否只想要一个旭日形图?即根本不需要使用子图? @RobRaymond 非常感谢您的帮助。如果我只想使用一种旭日纹,你知道我该怎么做吗? 知道了——使用 plotly express 会更简单,用更好的样本数据更新你的问题,我会为你提供答案 【参考方案1】: 据我从 cmets 了解到,您的主要目标是生成具有连续色阶的旭日形轨迹 用plotly express来做构建sunburst的核心功能就简单多了 这是一个使用所需颜色方法更新跟踪的简单案例 您的示例数据非常简单...已添加另一行来演示此方法

样本数据

import pandas as pd
import io
df = pd.read_csv(io.StringIO("""Region|State|PD|BP|Black
South. |.Florida. |. FL. |3|1500
North. | New York. |.NY. |7|1275
South. |Texas|TX|5|750"""), sep="|", engine="python")

具有连续色阶的旭日形

import plotly.express as px
import numpy as np

# use plotly express to build the sunburst.  Insert a "Total" column into dataframe so
# center of sunburst is the total
fig = px.sunburst(
    df.assign(Total="Total"), path=["Total", "Region", "State"], values="BP"
)

# want a continuous colorscale.  Simplest way is to use trace built by px and update it...
fig.update_traces(
    marker=
        "colors": fig.data[0]["values"],
        "colorscale": "RdBu",
        "cmid": np.mean(fig.data[0]["values"]),
    
)

输出

【讨论】:

非常感谢。你知道我为什么会得到以下信息吗? ModuleNotFoundError:没有名为“plotly.express”的模块。当我使用 pip 安装它时,我看到我拥有它,但我仍然在终端中收到错误 它是 plotly 的一部分,不需要单独的 pip 安装 我也是这么想的。我不知道为什么这不起作用,我收到了这个错误。因为它我无法加载可视化 评论中没有错误...你使用的环境? jupyter?jupyterlab? plotly 5.1.0 真正简化了在这个平台上的安装 我正在使用 plotly 版本 5.1.0 从我的烧瓶应用程序中运行出来

以上是关于Plotly Sunburst Chart (Python) - make_subplots 的“specs”参数必须是具有维度 (1 x 1) 的二维字典列表的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法改变 plotly.express.sunburst 图中叶子的不透明度?

旭日图(sunburst chart)绘制:R语言 & excel

plotly同时可视化表格与图(plotly Table and Chart )

ImportError: The plotly.plotly module is deprecated,please install the chart-studio

R语言plotly可视化:plotly可视化在对比条形图中添加误差条(Bar Chart with Error Bars with plotly in R)

在 Plotly Timeseries Chart 中更改时间刻度按钮的 CSS 样式