首页编程开发Matplotlib【数据可视化(Matplo...

【数据可视化(Matplotlib篇)】39.绘制极坐标图polar()

本系列文章配套代码获取有以下两种途径:

  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1jG-rGG4QMuZu0t0kEEl7SA?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Data_Visualization





极坐标图以极点为中心,用角度(θ)和半径(r)描述数据位置,区别于传统笛卡尔坐标系的 “横纵轴” 模式。它特别适合展示具有周期性、方向性的数据,能直观呈现数据随角度变化的规律,以及不同方向上的数值差异。

01

函数语法


Matplotlib polar()函数专门用于绘制极坐标图,其函数语法如下:
polar(theta, r, [fmt], **kwargs)
其中:
  • theta数组型,数据点的角度值,单位为弧度(若输入角度值需用np.radians()转换),形状需与r一致。
  • r数组型,数据点的半径值(从极点到数据点的距离),非负数值,形状需与theta一致。
  • fmt (可选):格式字符串,用于快速指定线条样式、颜色和标记点,格式为 ‘[color][marker][line]’。例如:‘ro-‘表示红色(r)、圆圈标记(o)、实线()。’–g*’表示绿色(g)、星号标记(*)、虚线()。如果省略 fmt,默认使用实线(‘-‘)且无标记点。

  • kwargs:可选参数,用于定制线条、标记、颜色等样式,与plot()函数类似。

【数据可视化(Matplotlib篇)】32.绘制折线图plot()

通过调整这些参数,可以灵活控制极坐标图的视觉效果。
# 生成数据
theta = np.linspace(0, 2 * np.pi, 8, endpoint=False)  # 8个等分角度
r = np.array([4, 7, 2, 5, 3, 6, 1, 8])  # 对应极径
# 在数组末尾添加起始点,实现闭合
theta = np.append(theta, theta[0])  # 补充起始角度
r = np.append(r, r[0])              # 补充起始极径

# 绘制极坐标图
ax = plt.figure(figsize=(6, 6))
plt.polar(theta, r, marker='o', linestyle='-', color='blue', linewidth=2)

# 添加标题与标签
plt.title('基础极坐标图示例', pad=20)  # pad控制标题与图的间距
plt.show()

可视化结果如下图所示:


  • 函数原理:

plt.polar()plt.plot()的便捷封装器,专为极坐标图设计,主要承担两项关键作用:

  • 确保极坐标坐标轴(Axes)环境

调用polar()时,它会先检查当前的坐标轴(绘图区域)是否已设置为极坐标模式。若未设置(例如前一个图表使用的是笛卡尔坐标系),则会自动创建一个新的极坐标坐标轴。这省去了手动配置的步骤,不过该方法依然有效)。

  • 将所有参数传递给pyplot.plot()

在确认极坐标坐标轴准备就绪后,polar()会将你提供的每一个参数(如color、marker、linestyle、label等)直接传递给pyplot.plot()。这意味着极坐标图的样式设置逻辑与笛卡尔线图完全一致。例如:使用polar(theta, r, color=’red’, marker=’o’),等效于先创建极坐标坐标轴,再在该坐标轴上调用plot(theta, r, color=’red’, marker=’o’)

因此有以下两种方式绘制极坐标图:

# 方法1:使用plt.polar()函数plt.polar(theta, r)
# 方法2:使用projection参数,显式创建极坐标子图fig, ax = plt.subplots(subplot_kw={'projection''polar'})ax.plot(theta, r)

两种方法在性能上没有显著差异,主要的区别在于编程范式和使用灵活性。

  • plt.polar() 胜在简洁易用,适合快速绘图;

  • projection=’polar’ 胜在灵活强大,其面向对象逻辑符合 Matplotlib 设计理念,适合复杂应用。

02

使用示例


  • 示例1:自定义极坐标图

极坐标图的样式自定义需围绕数据呈现需求,通过面向对象接口(ax.xxx方法)实现。例如本次从数据展示样式、网格与刻度、角度系统三个维度展开

  • 基础样式(线条、标记、填充)通过绘图函数参数控制;

  • 网格与刻度通过set_rgrids()set_xticks()等方法定制;
  • 角度系统通过set_theta_zero_location()set_theta_direction()适配业务场景(如方位角、时钟式角度等)。
# 生成数据
theta = np.linspace(0, 2 * np.pi, 8, endpoint=False)  # 8个等分角度
r = np.array([4, 7, 2, 5, 3, 6, 1, 8])  # 对应极径
# 在数组末尾添加起始点,实现闭合
theta = np.append(theta, theta[0])  # 补充起始角度
r = np.append(r, r[0])              # 补充起始极径

fig = plt.figure(figsize=(6, 6))
ax = fig.add_subplot(111, projection='polar')

# ================自定义极坐标图=======================
# 绘制极坐标图
ax.plot(theta, r, 
        marker='*'
        markersize=10,
        markerfacecolor='red',
        markeredgecolor='k',
        linestyle='--'
        color='blue'
        linewidth=1.0
       )

# 填充内部区域
plt.fill_between(theta, r, color='lightblue', alpha=0.5)

# 设置网格线
ax.grid(True, linestyle='--', alpha=0.5)
# 设置半径范围
ax.set_rlim(1, 8)
# 定制径向网格线
ax.set_rgrids([2, 4, 6, 8], labels=['Low''Medium''High''Max'], 
              angle=180, fontsize=10, color='k')

# 设置角度刻度
ax.set_xticks(np.linspace(0, 2*np.pi, 8, endpoint=False))
ax.set_xticklabels(['N''NE''E''SE''S''SW''W''NW'], fontsize=12, color='purple')
# 设置角度零点位置(北方向)
ax.set_theta_zero_location('N')
# 设置角度增加方向(顺时针)
ax.set_theta_direction(-1)
# ================自定义极坐标图=======================

# 添加标题与标签
plt.title('自定义极坐标图', pad=20)
plt.show()

可视化结果如下图所示:


  • 示例2:风向玫瑰图

极坐标下的条形图能直观展示周期性数据,典型应用就是用于制作风向玫瑰图,显示风向和风速的分布。

# 生成示例数据
directions = np.linspace(0, 2*np.pi, 8)
speeds = [2, 5, 3, 4, 6, 3, 2, 1]

# 创建极坐标条形图
ax = plt.subplot(111, projection='polar')
ax.bar(directions, speeds, alpha=0.7, width=0.5)

# 设置标题和标签
ax.set_title('风向玫瑰图', va='bottom')
plt.show()

可视化结果如下图所示:


  • 示例3:雷达图

雷达图是极坐标的典型应用,适合展示多维数据比较。

# 数据准备
categories = ['市场调查''运营分析''Python''数据库''经济学''统计学']
student_a = [5, 4, 3, 2, 4, 5]  # 学生A的评分
student_b = [3, 2, 4, 5, 3, 2]  # 学生B的评分

# 闭合数据
theta = np.linspace(0, 2 * np.pi, len(categories), endpoint=False)
theta = np.concatenate([theta, [theta[0]]])
a_scores = np.concatenate([student_a, [student_a[0]]])
b_scores = np.concatenate([student_b, [student_b[0]]])

# 绘制雷达图
plt.figure(figsize=(5, 5))
ax = plt.subplot(111, projection='polar')
ax.plot(theta, a_scores, 'o-', linewidth=2, label='学生A')
ax.fill(theta, a_scores, alpha=0.25, color='blue')
ax.plot(theta, b_scores, 's-', linewidth=2, label='学生B')
ax.fill(theta, b_scores, alpha=0.25, color='red')

# 定制标签
ax.set_xticks(theta[:-1])
ax.set_xticklabels(categories, fontsize=12)
# 调整标签的位置
labels = ax.get_xticklabels()
for label, angle in zip(labels, theta[:-1]):
    label.set_position((angle, label.get_position()[1]-0.1))  # 向外微调

ax.set_title('学生能力评估雷达图', pad=30)
ax.legend(loc='center left', bbox_to_anchor=(1.2, 0.5))

plt.show()

可视化结果如下图所示:


  • 示例4:极坐标散点图

极坐标散点图可展示离散数据在极坐标中的分布,适合分析 “方向 – 数值” 类离散观测值(如卫星信号强度)。

# 生成随机数据
np.random.seed(42)
theta = np.random.uniform(0, 2*np.pi, 100)
r = np.random.uniform(0, 1, 100)
sizes = 100 * np.random.rand(100)
colors = np.random.rand(100)

# 创建极坐标图
ax = plt.subplot(111, projection='polar')

# 绘制散点图(plt.polar 不支持 cmap)
sc = ax.scatter(theta, r, c=colors, s=sizes, cmap='hsv', alpha=0.7)

# 添加颜色条
plt.colorbar(sc, ax=ax, label='颜色值')

plt.title("极坐标散点图", pad=20)
plt.show()

可视化结果如下图所示:


  • 示例5:极坐标等高线图

极坐标等高线图适用于展示二维数据在极坐标系统中的分布情况,特别适合分析具有旋转对称性或角度相关性的数据(如电磁场分布、气象数据等)。

# 生成网格数据
theta = np.linspace(0, 2*np.pi, 100)
r = np.linspace(0, 1, 50)
T, R = np.meshgrid(theta, r)
Z = np.sin(3*T) * R**2

# 创建极坐标图
ax = plt.subplot(111, projection='polar')

# 绘制等高线图
contour = ax.contourf(T, R, Z, 20, cmap='coolwarm')

# 添加颜色条
plt.colorbar(contour, ax=ax, label='Z值')

plt.title("极坐标等高线图", pad=20)
plt.show()

可视化结果如下图所示:



更多内容可以前往官网查看

https://matplotlib.org/stable/


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments