更新plotlyexpress中的条形图

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

我有一个破折号应用程序,我在其中过滤数据,然后使用以下代码绘制它:

def filter_dataframe(selected_racetracks, selected_bops):
filtered_df = df_bop.copy()  # Initialize with original DataFrame

# Perform data filtering based on left-hand side filter
filtered_df = filtered_df.loc[(filtered_df['racetrack'] == selected_racetracks[0])]

# Check if selected_bops is None or empty list
if not selected_bops[0] is None:
    filtered_df = filtered_df[filtered_df['bop'] == selected_bops[0]]

# Get the first racetrack from the list
racetrack_str = selected_racetracks[0] if selected_racetracks else None
# Check if the filtered DataFrame is empty
if filtered_df.empty:
    # Return an empty figure if the filtered DataFrame is empty
    return {'data': [], 'layout': {}}
# ==================== Figure 1 ================================
fig_weight = px.bar(
    filtered_df,
    x='make_model',
    y='total_weight_wo_driver',
    barmode='group',
    color='bop_date',
    template="plotly_dark",
    text="total_weight_wo_driver",
)


# Additional traces for the second and third rows of filters
for racetrack, bop in zip(selected_racetracks[1:], selected_bops[1:]):
    if racetrack and bop:
        filtered_df_additional = df_bop[(df_bop['racetrack'] == racetrack) & (df_bop['bop'] == bop)]
        date_string = datetime.strptime(filtered_df_additional['bop_date'].unique()[0], '%Y.%m.%d').strftime('%Y.%m.%d')
        bar_text = filtered_df_additional['total_weight_wo_driver']
        if not filtered_df_additional.empty:
            fig_weight.add_bar(
                x=filtered_df_additional['make_model'],
                y=filtered_df_additional['total_weight_wo_driver'],
                name=date_string,   # set trace name
                text=bar_text
            )


fig_weight.update_xaxes(
    tickangle=-70)

fig_weight.update_layout(
    title_text=racetrack_str + " BOP total weight evolution",
    title_xanchor="left",
    barmode='group',
    yaxis_range=[1200, 1400],
    height=600,
    title_font=dict(size=24)
)

return fig_weight

我的问题是,当我使用加法跟踪部分时,一切正常,但生成的条形图覆盖了第一个图表,如下所示:

解决这个问题有什么有用的提示吗?

我尝试直接在循环内生成图形,但随后出现错误,表明图形无法完成。

谢谢您的帮助!

plotly bar-chart
1个回答
0
投票

我终于找到了解决我的问题的方法:

def filter_dataframe(selected_racetracks, selected_bops):
# Initialize an empty figure data list
fig_data = []
# Define a color map for unique bop_dates
color_map = {}
# Perform data filtering based on selected filters
for i, (racetrack, bop) in enumerate(zip(selected_racetracks, selected_bops)):
    if racetrack and bop:
        filtered_df = df_bop[(df_bop['racetrack'] == racetrack) & (df_bop['bop'] == bop)]
        if not filtered_df.empty:
            # Create a new bar chart for each filter combination
            fig_weight = px.bar(
                filtered_df,
                x='make_model',
                y='total_weight_wo_driver',
                barmode='group',
                color='bop_date',
                template="plotly_dark",
                text='total_weight_wo_driver',
                width=1600
            )
            # Assign a unique color for each bop_date category
            for date in filtered_df['bop_date'].unique():
                if date not in color_map:
                    color_map[date] = px.colors.qualitative.Plotly[i % 10]  # Choose color from Plotly qualitative palette

            # Map bop_date to color
            # filtered_df.loc[:, 'color'] = filtered_df['bop_date'].map(color_map)
            filtered_df = filtered_df.assign(color=filtered_df['bop_date'].map(color_map))

            fig_weight.update_traces(marker=dict(color=filtered_df['color']))
            fig_weight.update_xaxes(tickangle=-70)

            fig_weight.update_layout(
                title_text=f"{racetrack} BOP total weight evolution",
                title_xanchor="left",
                yaxis_range=[1200, 1400],
                height=600,
                title_font=dict(size=24)
            )

            # Append the bar chart data to the list
            fig_data.append(fig_weight)

# Combine all traces into a single figure
combined_weight = fig_data[0].to_dict() if fig_data else {'data': [], 'layout': {}}
combined_weight['data'] += [trace for fig in fig_data[1:] for trace in fig.to_dict()['data']]

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