如何为Plotly柱状图的每个条形单独设置透明度?
为Plotly柱状图的每个条形单独设置透明度
Plotly Express的opacity参数是全局配置项,仅支持单个数值,无法通过列表为每个条形单独设置透明度,所以你传入[1, 1, 0.1, 0.1]时只会生效第一个值。下面提供两种可行的解决方法:
方法一:使用Plotly Graph Objects手动构建图表
Plotly Graph Objects(plotly.graph_objects)支持更精细的元素控制,可以为每个条形(对应一个trace)单独定义颜色和透明度:
import plotly.graph_objects as go import pandas as pd df1 = pd.DataFrame(dict(score=[93.3, 93.3, 92, 88], model=['model1', 'model2', 'model3', 'model4'])) # 定义每个模型对应的颜色和透明度 color_map = { "model1": "gray", "model2": "rgb(255, 10, 10)", "model3": "rgb(255, 10, 10)", "model4": "rgb(255, 10, 10)" } opacity_list = [1, 1, 0.1, 0.1] fig = go.Figure() # 逐个添加条形trace for idx, row in df1.iterrows(): fig.add_trace(go.Bar( x=[row['score']], y=[row['model']], marker=dict( color=color_map[row['model']], opacity=opacity_list[idx] ), name=row['model'] )) # 设置布局 fig.update_layout( xaxis_range=[80, 100], xaxis_title='Score', yaxis_title='', barmode='stack' # 保持横向条形的排列方式,和px.bar一致 ) fig.show()
方法二:修改Plotly Express生成的图表对象
先用px.bar生成基础图表,再通过遍历图表的data属性(每个元素对应一个条形的trace),单独设置每个trace的透明度:
import plotly.express as px import pandas as pd df1 = pd.DataFrame(dict(score=[93.3, 93.3, 92, 88], model=['model1', 'model2', 'model3', 'model4'])) fig = px.bar(df1, x='score', y='model', color='model', color_discrete_map={ "model1": "gray", "model2": "rgb(255, 10, 10)", "model3": "rgb(255, 10, 10)", "model4": "rgb(255, 10, 10)"}) # 为每个trace设置对应透明度 opacity_list = [1, 1, 0.1, 0.1] for i, trace in enumerate(fig.data): trace.marker.opacity = opacity_list[i] fig.update_layout(xaxis_range=[80,100], xaxis_title='Score', yaxis_title='') fig.show()
内容的提问来源于stack exchange,提问作者Connor
相关产品推荐
相关产品推荐

