使用Plotly.py创建水平条形图的完整指南
水平条形图概述
水平条形图(也称为横向条形图)是数据可视化中常用的一种图表类型,特别适合展示类别间的比较。与垂直条形图相比,水平条形图在以下场景中更具优势:
- 类别名称较长时,水平布局可以提供更好的可读性
- 当类别数量较多时,水平布局可以更好地利用屏幕空间
- 在需要强调数值差异而非类别本身时
Plotly.py作为Python中强大的交互式可视化库,提供了多种创建水平条形图的方法,本文将详细介绍这些方法及其应用场景。
使用Plotly Express创建基础水平条形图
Plotly Express是Plotly的高级接口,可以快速创建各种图表。创建水平条形图只需在px.bar()
函数中设置orientation='h'
参数。
基本示例
import plotly.express as px
df = px.data.tips() # 加载示例数据集
fig = px.bar(df, x="total_bill", y="day", orientation='h')
fig.show()
这段代码会创建一个简单的水平条形图,x轴显示账单总额,y轴显示星期几。
进阶配置
我们可以通过添加更多参数来增强图表的表达能力:
import plotly.express as px
df = px.data.tips()
fig = px.bar(df, x="total_bill", y="sex", color='day', orientation='h',
hover_data=["tip", "size"], # 悬停时显示小费和人数
height=400, # 设置图表高度
title='餐厅账单统计') # 添加标题
fig.show()
这个例子中,我们:
- 使用不同颜色区分星期几
- 鼠标悬停时会显示额外的小费和用餐人数信息
- 设置了自定义高度和标题
使用graph_objects创建水平条形图
虽然Plotly Express简单易用,但有时我们需要更精细的控制。这时可以使用plotly.graph_objects
模块中的go.Bar
类。
基础水平条形图
import plotly.graph_objects as go
fig = go.Figure(go.Bar(
x=[20, 14, 23], # 数值数据
y=['长颈鹿', '猩猩', '猴子'], # 类别数据
orientation='h')) # 设置为水平方向
fig.show()
带颜色的水平条形图
我们可以为不同的数据系列设置不同的颜色和样式:
import plotly.graph_objects as go
fig = go.Figure()
# 添加第一个数据系列
fig.add_trace(go.Bar(
y=['长颈鹿', '猩猩', '猴子'],
x=[20, 14, 23],
name='旧金山动物园',
orientation='h',
marker=dict(
color='rgba(246, 78, 139, 0.6)', # 设置填充颜色和透明度
line=dict(color='rgba(246, 78, 139, 1.0)', width=3) # 设置边框颜色和宽度
)
))
# 添加第二个数据系列
fig.add_trace(go.Bar(
y=['长颈鹿', '猩猩', '猴子'],
x=[12, 18, 29],
name='洛杉矶动物园',
orientation='h',
marker=dict(
color='rgba(58, 71, 80, 0.6)',
line=dict(color='rgba(58, 71, 80, 1.0)', width=3)
)
))
fig.update_layout(barmode='stack') # 设置为堆叠模式
fig.show()
高级应用:带颜色调色板的条形图
对于需要展示多个维度的数据,我们可以使用颜色调色板来增强图表的表达能力:
import plotly.graph_objects as go
# 定义标签和颜色
等级标签 = ['非常<br>同意', '同意', '中立', '不同意', '非常<br>不同意']
颜色 = ['rgba(38, 24, 74, 0.8)', 'rgba(71, 58, 131, 0.8)',
'rgba(122, 120, 168, 0.8)', 'rgba(164, 163, 204, 0.85)',
'rgba(190, 192, 213, 1)']
x数据 = [[21, 30, 21, 16, 12],
[24, 31, 19, 15, 11],
[27, 26, 23, 11, 13],
[29, 24, 15, 18, 14]]
y数据 = ['课程组织<br>高效',
'课程提升了我在该<br>主题上的能力和技巧',
'课程培养了我对该<br>主题的批判性思维能力',
'我会向朋友<br>推荐这门课程']
fig = go.Figure()
# 添加每个数据系列
for i in range(0, len(x数据[0])):
for xd, yd in zip(x数据, y数据):
fig.add_trace(go.Bar(
x=[xd[i]], y=[yd],
orientation='h',
marker=dict(
color=颜色[i],
line=dict(color='rgb(248, 248, 249)', width=1)
)
))
# 更新布局
fig.update_layout(
xaxis=dict(showgrid=False, showline=False, showticklabels=False, zeroline=False),
barmode='stack',
paper_bgcolor='rgb(248, 248, 255)',
plot_bgcolor='rgb(248, 248, 255)',
margin=dict(l=120, r=10, t=140, b=80),
showlegend=False,
)
fig.show()
组合图表:条形图与折线图
有时我们需要在同一个图表中展示不同类型的数据,Plotly可以轻松实现这种组合:
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np
# 准备数据
储蓄率 = [1.3586, 2.2623, 4.9822, 6.5097, 7.4812, 7.5133, 15.2148, 17.5205]
净资产 = [93453.92, 81666.57, 69889.62, 78381.53, 141395.30, 92969.02, 66090.18, 122379.3]
国家 = ['日本', '英国', '加拿大', '荷兰', '美国', '比利时', '瑞典', '瑞士']
# 创建子图
fig = make_subplots(rows=1, cols=2, specs=[[{}, {}]], shared_xaxes=True,
shared_yaxes=False, vertical_spacing=0.001)
# 添加条形图(左)
fig.append_trace(go.Bar(
x=储蓄率,
y=国家,
marker=dict(color='rgba(50, 171, 96, 0.6)'),
name='家庭储蓄率(占可支配收入百分比)',
orientation='h',
), 1, 1)
# 添加折线图(右)
fig.append_trace(go.Scatter(
x=净资产, y=国家,
mode='lines+markers',
line_color='rgb(128, 0, 128)',
name='家庭净资产(百万美元/人均)',
), 1, 2)
# 更新布局
fig.update_layout(
title='OECD国家家庭储蓄率与净资产比较',
yaxis=dict(domain=[0, 0.85]),
yaxis2=dict(showline=True, linecolor='rgba(102, 102, 102, 0.8)'),
xaxis=dict(domain=[0, 0.42]),
xaxis2=dict(domain=[0.47, 1], side='top', dtick=25000),
legend=dict(x=0.029, y=1.038),
margin=dict(l=100, r=20, t=70, b=70),
paper_bgcolor='rgb(248, 248, 255)',
plot_bgcolor='rgb(248, 248, 255)',
)
fig.show()
最佳实践与技巧
- 标签处理:当类别名称较长时,考虑使用
<br>
标签进行换行 - 颜色选择:使用透明度(rgba中的a值)可以使堆叠条形图更清晰
- 交互功能:充分利用Plotly的悬停提示功能展示额外信息
- 响应式设计:考虑不同设备的显示效果,适当调整图表尺寸
- 无障碍设计:确保颜色对比度足够,方便色盲用户阅读
通过掌握这些技巧,你可以创建出既美观又实用的水平条形图,有效传达数据背后的故事。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考