如何在Python Plotly地图中用颜色区分正负值并以大小表示销量差异
解决Plotly地图正负销量差异的颜色与大小设置问题
我懂你的需求啦——要让地图上的圆点用颜色区分正负销量差异,同时圆点大小只看差异的绝对值,不用管正负,这样负值的点就不会因为数值为负而显得过小了。咱们一步步来调整你的代码:
核心修改思路
- 圆点大小优化:把
size参数替换为差异值的绝对值,这样正负值的大小都对应实际差异的量级,彻底解决负值点偏小的问题; - 正负颜色区分:自定义一个双色刻度(colorscale),让负值对应一种色系(比如蓝色),正值对应另一种色系(比如红色),以0为分界点实现清晰区分;
- 颜色刻度对称:将
cmin和cmax设置为正负差异的最大绝对值,让颜色映射更对称,视觉上更平衡直观。
修改后的完整代码
import plotly.plotly as py from plotly.graph_objs import * mapbox_access_token = '**Mapbox API**' # 计算差异的绝对值,用于设置圆点大小 size_values = abs(part1_loc['diff2018']) # 获取最大的差异绝对值,让颜色刻度对称 max_abs_diff = max(size_values) data = Data([ Scattermapbox( lat=part1_loc['Latitude'], lon=part1_loc['Longitude'], text=part1_loc['diff2018'], mode='markers', marker=Marker( showscale=True, cmax=max_abs_diff, # 对称的正向最大值 cmin=-max_abs_diff, # 对称的负向最小值 size=size_values, # 用绝对值控制圆点大小 color=part1_loc['diff2018'], # 基于原始正负值映射颜色 # 自定义双色刻度:负值蓝色,0处白色,正值红色 colorscale=[[0, 'rgb(0, 0, 255)'], [0.5, 'rgb(255,255,255)'], [1, 'rgb(255, 0, 0)']], opacity=0.6, symbol='circle', # 给颜色条添加标题和自定义刻度,提升可读性 colorbar=dict( title="销量差异", tickvals=[-max_abs_diff, 0, max_abs_diff], ticktext=["负向最大", "无差异", "正向最大"] ) ), ) ]) layout = Layout( autosize=True, hovermode='closest', width=1450, margin=go.Margin( l=10, r=100, b=10, t=10 ), height=650, mapbox=dict( accesstoken=mapbox_access_token, bearing=0, pitch=0, zoom=8.9, style='light', ), ) fig = dict(data=data, layout=layout) py.iplot(fig, filename='Sales_diff')
效果说明
- 所有圆点的大小仅与销量差异的绝对值相关,负值点不会再因数值为负而被缩小;
- 负值区域显示为蓝色,正值区域显示为红色,0附近的点为白色,颜色条清晰标注了正负方向的差异量级;
- 颜色刻度对称,正负方向的颜色映射范围一致,视觉呈现更平衡。
如果想要调整配色,直接修改colorscale里的RGB值即可,比如把蓝色换成深灰色、红色换成橙色,都能灵活适配你的需求。
内容的提问来源于stack exchange,提问作者Axis
相关产品推荐
相关产品推荐

