You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python中创建环形柱状图?基于Pandas Series的实现方案问询

如何用Python实现环形柱状图(Circular Barplot)

没问题!我来一步步教你用Python实现环形柱状图,刚好适配你的Pandas Series数据。下面我会分享两种常用的实现方式:基于Matplotlib的静态图,以及基于Plotly的交互式图,你可以根据需求选择。

准备示例数据

首先我们先把你提供的示例数据转换成Pandas Series:

import pandas as pd

# 你的示例数据:A 33、B 62、C 56、D 70
data = pd.Series([33, 62, 56, 70], index=['A', 'B', 'C', 'D'])

方法一:用Matplotlib实现静态环形柱状图

Matplotlib是Python最常用的可视化库,适合生成静态的环形柱状图。核心思路是利用**极坐标(Polar Coordinates)**来绘制条形:

import matplotlib.pyplot as plt
import numpy as np

# 计算每个类别的角度(环形总角度为2π)
n_categories = len(data)
angles = np.linspace(0, 2 * np.pi, n_categories, endpoint=False)
values = data.values
labels = data.index

# 创建画布和极坐标轴
plt.figure(figsize=(8, 8))
ax = plt.subplot(111, polar=True)

# 绘制环形柱状图:bottom参数控制内圈半径,width控制条形宽度
bars = ax.bar(
    angles, 
    values, 
    width=2 * np.pi / n_categories,  # 每个条形的宽度刚好填满环形
    bottom=10,  # 设置内圈空白大小,数值越大内圈越宽
    color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728']  # 自定义条形颜色
)

# 设置类别标签,对应每个条形的位置
ax.set_xticks(angles)
ax.set_xticklabels(labels, fontsize=12)

# 优化样式:隐藏径向刻度,保留径向网格线
ax.set_yticklabels([])
ax.yaxis.grid(True)
ax.xaxis.grid(False)

# 给每个条形添加数值标签
for bar, val in zip(bars, values):
    ax.text(
        bar.get_x() + bar.get_width()/2, 
        bar.get_y() + val/2,
        f'{val}', 
        ha='center', va='center', 
        fontsize=12, fontweight='bold'
    )

# 添加标题
plt.title('静态环形柱状图', y=1.1, fontsize=14)
plt.show()

方法二:用Plotly实现交互式环形柱状图

如果你需要交互式的可视化(比如鼠标悬停查看数值、缩放等),可以用Plotly库:

import plotly.graph_objects as go

fig = go.Figure()

# 添加环形条形轨迹
fig.add_trace(go.Barpolar(
    r=data.values,  # 条形长度对应数据值
    theta=data.index,  # 类别标签
    width=[1]*n_categories,  # 每个条形的宽度(1对应约90度,适配4个类别)
    marker_color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728'],
    marker_line_color="white",
    marker_line_width=2,
    hovertemplate='类别: %{theta}<br>数值: %{r}<extra></extra>'  # 自定义悬停提示内容
))

# 布局优化
fig.update_layout(
    title='交互式环形柱状图',
    title_font_size=16,
    polar=dict(
        radialaxis=dict(
            visible=True,
            range=[0, max(data.values)+10]  # 设置径向轴范围,避免条形超出画布
        )),
    showlegend=False
)

# 显示交互式图形
fig.show()

关键参数说明

  • Matplotlib中的bottom:控制环形内圈的空白大小,数值越大,内圈越宽;设为0就是普通的极坐标条形图(无内圈)。
  • Matplotlib中的width:每个条形的角度宽度,2*np.pi/n_categories可以让条形刚好填满整个环形,无重叠。
  • Plotly中的width:每个条形的宽度,单位是极坐标的角度单位,对于n个类别,设置为360/n对应的数值(比如4个类别设为1,对应90度)。

内容的提问来源于stack exchange,提问作者famargar

火山引擎 最新活动