Plotly JupyterDash 在应用 categoryorder 排序以使用负值进行测量时不会删除不相关的列
Plotly JupyterDash is not removing irrelevant columns when applying categoryorder sort to measure with a negative value
我正在尝试根据“销售额”列中的值对图表的轴进行排序。一旦我将 fig.update_layout(yaxis={'categoryorder':'total descending'}) 应用于我的图形,图表在通过为 RadioItems 选择“099”值过滤数据帧时不再删除不相关的行回调选项。
重现问题的代码:
import pandas as pd
from plotly import tools
import plotly.express as px
import plotly.graph_objects as go
import dash
import dash_core_components as dcc
import dash_html_components as html
from jupyter_dash import JupyterDash
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output
data = {'name': {0: 'G P', 1: 'D L', 2: 'T B', 3: 'N A', 4: 'P O', 5: 'Ho A'},
'team': {0: '099', 1: '099', 2: '073', 3: '073', 4: '073', 5: '099'},
'sales': {0: 88946, 1: 8123, 2: 6911, 3: 74796, 4: 8532, 5: -31289}
}
df1 = pd.DataFrame.from_dict(data)
app = JupyterDash(external_stylesheets=[dbc.themes.SLATE])
template = 'plotly_dark'
controls = dbc.Card(
[
dbc.FormGroup(
[
dbc.Label("Teams"),
dcc.RadioItems(
id='slm-radio',
options=[{'label': 'All', 'value': 'All'}] +
[{'label': k, 'value': k} for k in df1['team'].unique()],
value='All',
),
],
)
]
)
app.layout = dbc.Container(
[
dbc.Row([
dbc.Col([controls],xs = 4),
dbc.Col([
dbc.Row([
dbc.Col(dcc.Graph(id="sales_graph")),
])
]),
]),
html.Br(),
],
fluid=True,
)
@app.callback(
Output("sales_graph", "figure"),
[
Input("slm-radio", "value")
],
)
def history_graph(team):
dataset = df1
if not team == 'All':
dataset = dataset[dataset['team']==team]
else:
dataset = dataset
v_cat = dataset['name']
x_val = dataset['sales']
fig = go.Figure(go.Bar(
x=x_val,
y=v_cat,
marker_color="#ff0000",
orientation='h',
width=0.25
))
fig.update_layout(template='plotly_dark')
fig.update_layout(yaxis={'categoryorder':'total descending'})
return fig
app.run_server(mode='inline', port = 8009)
期望的结果是在选择“099”时删除 N A、P O 和 T B 列
如果满足以下条件,我会得到想要的结果:
- 'Ho A' 的值更改为正值
- 删除轴排序
- 如果图形是在没有破折号的情况下使用本地 plotly 渲染的
我能够通过独立于绘图步骤计算排名并将排名放入一个系列来解决这个问题,rankings
。然后我将排名系列传递给
fig.update_layout(yaxis={'categoryorder':'array', 'categoryarray':rankings['team_rank']})
我正在尝试根据“销售额”列中的值对图表的轴进行排序。一旦我将 fig.update_layout(yaxis={'categoryorder':'total descending'}) 应用于我的图形,图表在通过为 RadioItems 选择“099”值过滤数据帧时不再删除不相关的行回调选项。
重现问题的代码:
import pandas as pd
from plotly import tools
import plotly.express as px
import plotly.graph_objects as go
import dash
import dash_core_components as dcc
import dash_html_components as html
from jupyter_dash import JupyterDash
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output
data = {'name': {0: 'G P', 1: 'D L', 2: 'T B', 3: 'N A', 4: 'P O', 5: 'Ho A'},
'team': {0: '099', 1: '099', 2: '073', 3: '073', 4: '073', 5: '099'},
'sales': {0: 88946, 1: 8123, 2: 6911, 3: 74796, 4: 8532, 5: -31289}
}
df1 = pd.DataFrame.from_dict(data)
app = JupyterDash(external_stylesheets=[dbc.themes.SLATE])
template = 'plotly_dark'
controls = dbc.Card(
[
dbc.FormGroup(
[
dbc.Label("Teams"),
dcc.RadioItems(
id='slm-radio',
options=[{'label': 'All', 'value': 'All'}] +
[{'label': k, 'value': k} for k in df1['team'].unique()],
value='All',
),
],
)
]
)
app.layout = dbc.Container(
[
dbc.Row([
dbc.Col([controls],xs = 4),
dbc.Col([
dbc.Row([
dbc.Col(dcc.Graph(id="sales_graph")),
])
]),
]),
html.Br(),
],
fluid=True,
)
@app.callback(
Output("sales_graph", "figure"),
[
Input("slm-radio", "value")
],
)
def history_graph(team):
dataset = df1
if not team == 'All':
dataset = dataset[dataset['team']==team]
else:
dataset = dataset
v_cat = dataset['name']
x_val = dataset['sales']
fig = go.Figure(go.Bar(
x=x_val,
y=v_cat,
marker_color="#ff0000",
orientation='h',
width=0.25
))
fig.update_layout(template='plotly_dark')
fig.update_layout(yaxis={'categoryorder':'total descending'})
return fig
app.run_server(mode='inline', port = 8009)
期望的结果是在选择“099”时删除 N A、P O 和 T B 列
如果满足以下条件,我会得到想要的结果:
- 'Ho A' 的值更改为正值
- 删除轴排序
- 如果图形是在没有破折号的情况下使用本地 plotly 渲染的
我能够通过独立于绘图步骤计算排名并将排名放入一个系列来解决这个问题,rankings
。然后我将排名系列传递给
fig.update_layout(yaxis={'categoryorder':'array', 'categoryarray':rankings['team_rank']})