如何在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




