技术问询:能否用Plotly制作分组堆叠条形图展示各站点良率?
使用Plotly实现分组堆叠条形图展示站点良率
完全可以用Plotly实现分组堆叠条形图,这种图表能完美匹配你的需求——在同一视图中清晰对比不同站点的True Yield(真实良率)和First Pass Yield(首次通过良率),通过分组与堆叠的组合,既能区分不同分类维度,又能展示指标的构成关系。
下面提供两种场景的实现代码:
场景1:带额外分组维度的分组堆叠条形图
如果你的数据存在额外分类维度(比如产品线),需要每个大分组下的站点对应堆叠的两个良率指标,可以用以下代码实现:
import plotly.graph_objects as go # 模拟业务数据 sites = ["Site A", "Site B", "Site C"] product_lines = ["Line 1", "Line 2"] # 真实良率:[[SiteA-Line1, SiteA-Line2], [SiteB-Line1, SiteB-Line2], ...] true_yield_data = [[85, 90], [88, 92], [91, 87]] # 首次通过良率:结构同上 first_pass_yield_data = [[78, 82], [80, 85], [83, 79]] # 配置分组间距与条形宽度 group_gap = 0.3 bar_width = (1 - group_gap) / len(product_lines) fig = go.Figure() # 为每条产品线添加堆叠条形 for idx, line in enumerate(product_lines): # 计算当前产品线条形的x轴偏移位置 x_positions = [site_idx + idx * bar_width for site_idx in range(len(sites))] # 添加真实良率条形 fig.add_trace(go.Bar( x=x_positions, y=[row[idx] for row in true_yield_data], name=f"{line} - 真实良率", width=bar_width, marker_color="#1f77b4" if idx == 0 else "#ff7f0e" )) # 添加首次通过良率条形(堆叠在真实良率上方) fig.add_trace(go.Bar( x=x_positions, y=[row[idx] for row in first_pass_yield_data], name=f"{line} - 首次通过良率", width=bar_width, marker_color="#aec7e8" if idx == 0 else "#ffbb78", base=[row[idx] for row in true_yield_data] )) # 优化图表布局 fig.update_layout( title="各站点产品线良率对比(分组堆叠条形图)", xaxis=dict( tickmode="array", tickvals=[site_idx + bar_width*(len(product_lines)-1)/2 for site_idx in range(len(sites))], ticktext=sites, title="站点" ), yaxis=dict(title="良率 (%)", range=[0, 100]), barmode="stack", legend_title="指标类型", margin=dict(l=40, r=40, t=60, b=40) ) fig.show()
场景2:单分组堆叠条形图(仅站点维度)
如果不需要额外分组维度,仅需展示每个站点下两个良率的堆叠对比,用Plotly Express可以快速实现:
import plotly.express as px import pandas as pd # 将数据整理为长格式(Plotly Express推荐格式) yield_data = pd.DataFrame({ "站点": ["Site A", "Site A", "Site B", "Site B", "Site C", "Site C"], "良率类型": ["真实良率", "首次通过良率"] * 3, "良率值": [85, 78, 88, 80, 91, 83] }) fig = px.bar( yield_data, x="站点", y="良率值", color="良率类型", barmode="stack", title="各站点良率对比(堆叠条形图)", labels={"良率值": "良率 (%)"}, color_discrete_map={ "真实良率": "#1f77b4", "首次通过良率": "#aec7e8" } ) # 固定y轴范围,确保良率百分比展示更直观 fig.update_layout(yaxis_range=[0, 100]) fig.show()
内容的提问来源于stack exchange,提问作者Suljabay
相关产品推荐
相关产品推荐

