使用Plotly.py创建水平条形图的完整指南

使用Plotly.py创建水平条形图的完整指南

plotly.py The interactive graphing library for Python :sparkles: This project now includes Plotly Express! plotly.py 项目地址: https://gitcode.com/gh_mirrors/pl/plotly.py

水平条形图概述

水平条形图(也称为横向条形图)是数据可视化中常用的一种图表类型,特别适合展示类别间的比较。与垂直条形图相比,水平条形图在以下场景中更具优势:

  1. 类别名称较长时,水平布局可以提供更好的可读性
  2. 当类别数量较多时,水平布局可以更好地利用屏幕空间
  3. 在需要强调数值差异而非类别本身时

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()

这个例子中,我们:

  1. 使用不同颜色区分星期几
  2. 鼠标悬停时会显示额外的小费和用餐人数信息
  3. 设置了自定义高度和标题

使用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()

最佳实践与技巧

  1. 标签处理:当类别名称较长时,考虑使用<br>标签进行换行
  2. 颜色选择:使用透明度(rgba中的a值)可以使堆叠条形图更清晰
  3. 交互功能:充分利用Plotly的悬停提示功能展示额外信息
  4. 响应式设计:考虑不同设备的显示效果,适当调整图表尺寸
  5. 无障碍设计:确保颜色对比度足够,方便色盲用户阅读

通过掌握这些技巧,你可以创建出既美观又实用的水平条形图,有效传达数据背后的故事。

plotly.py The interactive graphing library for Python :sparkles: This project now includes Plotly Express! plotly.py 项目地址: https://gitcode.com/gh_mirrors/pl/plotly.py

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邴联微

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值