如何使用 plotly 下拉菜单功能更新我的等值线图中的 z 值?

And*_*ndy 5 python-3.x plotly

我只想在绘图上创建一个菜单,我只能在其中更改数据中的 z 值。我尝试在这里查看其他示例:https : //plot.ly/python/dropdowns/#restyle-dropdown但这很难,因为这些示例与我的情节并不完全相似。

import plotly
import plotly.plotly as py
import plotly.graph_objs as go
import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2014_world_gdp_with_codes.csv')

data = [go.Choropleth(
    locations = df['CODE'],
    z = df['GDP (BILLIONS)'],
    text = df['COUNTRY'],
    colorscale = [
        [0, "rgb(5, 10, 172)"],
        [0.35, "rgb(40, 60, 190)"],
        [0.5, "rgb(70, 100, 245)"],
        [0.6, "rgb(90, 120, 245)"],
        [0.7, "rgb(106, 137, 247)"],
        [1, "rgb(220, 220, 220)"]
    ],
    autocolorscale = False,
    reversescale = True,
    marker = go.choropleth.Marker(
        line = go.choropleth.marker.Line(
            color = 'rgb(180,180,180)',
            width = 0.5
        )),
    colorbar = go.choropleth.ColorBar(
        tickprefix = '$',
        title = 'GDP<br>Billions US$'),
)]

layout = go.Layout(
    title = go.layout.Title(
        text = '2014 Global GDP'
    ),
    geo = go.layout.Geo(
        showframe = False,
        showcoastlines = False,
        projection = go.layout.geo.Projection(
            type = 'equirectangular'
        )
    ),
    annotations = [go.layout.Annotation(
        x = 0.55,
        y = 0.1,
        xref = 'paper',
        yref = 'paper',
        text = 'Source: <a href="https://www.cia.gov/library/publications/the-world-factbook/fields/2195.html">\
            CIA World Factbook</a>',
        showarrow = False
    )]
)

fig = go.Figure(data = data, layout = layout)
py.iplot(fig, filename = 'd3-world-map')
Run Code Online (Sandbox Code Playgroud)

Kat*_*Kat 1

自从有人问这个问题以来已经有一段时间了,但我认为它仍然值得回答。我无法说出自 2019 年提出这个问题以来,这个问题可能发生了怎样的变化,但这在今天是有效的。

在此输入图像描述 在此输入图像描述

在此输入图像描述 在此输入图像描述

首先,我将提供用于创建新值和下拉菜单的代码z,然后我将提供用于在一个块中创建这些图表的所有代码(更容易剪切和粘贴......以及所有这些) )。

这是我在该字段中用于备用数据的数据z

import plotly.graph_objects as go
import pandas as pd
import random

z2 = df['GDP (BILLIONS)'] * .667 + 12
random.seed(21)
random.shuffle(z2)
df['z2'] = z2                        # example as another column in df
print(df.head()) # validate as expected

z3 = df['GDP (BILLIONS)'] * .2 + 1000
random.seed(231)
random.shuffle(z3)                   # example as a series outside of df

z4 = df['GDP (BILLIONS)']**(1/3) * df['GDP (BILLIONS)']**(1/2)
random.seed(23)
random.shuffle(z4)
z4 = z4.tolist()                     # example as a basic Python list
Run Code Online (Sandbox Code Playgroud)

要添加要更改的按钮z,您需要将updatemenus其添加到布局中。每个dict()都是一个单独的下拉选项。每个按钮至少需要 a method、 alabelargs。这些代表正在更改的内容(method数据、布局或两者)、下拉列表中的名称 ( ) 以及新信息(本示例中的label新信息)。z

args对于数据更改(其中方法为restyleupdate)还可以包括更改所应用到的跟踪。因此,如果您同时拥有条形图和折线图,则可能有一个仅更改条形图的按钮。

使用与您相同的结构:

updatemenus = [go.layout.Updatemenu(
    x = 1, xanchor = 'right', y = 1.15, type = "dropdown", 
    pad = {'t': 5, 'r': 20, 'b': 5, 'l': 30}, # around all buttons (not indiv buttons)
    buttons = list([
        dict(
            args = [{'z': [df['GDP (BILLIONS)']]}], # original data; nest data in []
            label = 'Return to the Original z',
            method = 'restyle'                  # restyle is for trace updates
        ),
        dict(
            args = [{'z': [df['z2']]}],         # nest data in []
            label = 'A different z',
            method = 'restyle'
        ),
        dict(
            args = [{'z': [z3]}],               # nest data in []
            label = 'How about this z?',
            method = 'restyle'
        ),
        dict(
            args = [{'z': [z4]}],               # nest data in []
            label = 'Last option for z',
            method = 'restyle'
        )])
)]
Run Code Online (Sandbox Code Playgroud)

用于在一个块中创建此图的所有代码(包括上面显示的代码)。

import plotly.graph_objs as go
import pandas as pd
import ssl 
import random

# to collect data without an error
ssl._create_default_https_context = ssl._create_unverified_context

# data used in plot
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2014_world_gdp_with_codes.csv')

# z values used in buttons
z2 = df['GDP (BILLIONS)'] * .667 + 12
random.seed(21)
random.shuffle(z2)
df['z2'] = z2                       # example as another column in the data frame
print(df.head()) # validate as expected

z3 = df['GDP (BILLIONS)'] * .2 + 1000
random.seed(231)
random.shuffle(z3)                  # example as a series outside of the data frame

z4 = df['GDP (BILLIONS)']**(1/3) * df['GDP (BILLIONS)']**(1/2)
random.seed(23)
random.shuffle(z4)
z4 = z4.tolist()                    # example as a basic Python list

data = [go.Choropleth(
    locations = df['CODE'], z = df['GDP (BILLIONS)'], text = df['COUNTRY'],
    colorscale = [
        [0, "rgb(5, 10, 172)"],
        [0.35, "rgb(40, 60, 190)"],
        [0.5, "rgb(70, 100, 245)"],
        [0.6, "rgb(90, 120, 245)"],
        [0.7, "rgb(106, 137, 247)"],
        [1, "rgb(220, 220, 220)"]],
    reversescale = True,
    marker = go.choropleth.Marker(
        line = go.choropleth.marker.Line(
            color = 'rgb(180,180,180)', width = 0.5)),
    colorbar = go.choropleth.ColorBar(
        tickprefix = '$',
        title = 'GDP<br>Billions US$',
        len = .6)                           # I added this for aesthetics
)]

layout = go.Layout(
    title = go.layout.Title(text = '2014 Global GDP'),
    geo = go.layout.Geo(
        showframe = False, showcoastlines = False,
        projection = go.layout.geo.Projection(
            type = 'equirectangular')
    ),
    annotations = [go.layout.Annotation(
        x = 0.55, y = 0.1, xref = 'paper', yref = 'paper',
        text = 'Source: <a href="https://www.cia.gov/library/publications/the-world-factbook/fields/2195.html">\
            CIA World Factbook</a>',
        showarrow = False
    )],
    updatemenus = [go.layout.Updatemenu(
        x = 1, xanchor = 'right', y = 1.15, type = "dropdown",
        pad = {'t': 5, 'r': 20, 'b': 5, 'l': 30},
        buttons = list([
            dict(
                args = [{'z': [df['GDP (BILLIONS)']]}], # original data; nest data in []
                label = 'Return to the Original z',
                method = 'restyle'                  # restyle is for trace updates only
            ),
            dict(
                args = [{'z': [df['z2']]}],         # nest data in []
                label = 'A different z',
                method = 'restyle'
            ),
            dict(
                args = [{'z': [z3]}],               # nest data in []
                label = 'How about this z?',
                method = 'restyle'
            ),
            dict(
                args = [{'z': [z4]}],               # nest data in []
                label = 'Last option for z',
                method = 'restyle'
            )])
    )]
)

fig = go.Figure(data = data, layout = layout)
fig.show()
Run Code Online (Sandbox Code Playgroud)