You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何缩小极坐标图中新增笛卡尔子图坐标轴间的空白?

解决子图间空白过多的问题

问题原因

你当前的实现逻辑是先创建极坐标子图,隐藏后再在其位置上添加笛卡尔坐标轴。但常规的wspace或layout参数仅对原始极坐标子图生效,新添加的笛卡尔轴是独立的axes对象,不会继承这些间距设置,因此调整原参数无法改变子图间的空白。

解决方案

有两种可行思路:要么调整原始极坐标子图的间距(因为新笛卡尔轴基于原轴位置创建),要么直接创建笛卡尔子图,跳过极坐标子图的中间步骤,让常规间距参数正常生效。

方案1:调整原始极坐标子图的间距

在创建极坐标子图时,通过gridspec_kw设置wspace为负数,让原极坐标子图的位置重叠(因你的可视化内容是圆形,重叠后视觉上会更紧凑),新笛卡尔轴会继承这个紧凑的位置:

import numpy as np
import matplotlib.pyplot as plt

r_out = 6.0
level = np.linspace(-100,100,30)

axis_text = [r"$t/t_A = 0$", r"$t/t_A = 30$", r"$t/t_A = 60$"]

# 关键:通过gridspec_kw设置wspace为负数,压缩原极坐标子图的间距
fig, [ax1, ax2, ax3] = plt.subplots(1,3,figsize=(15,4), 
                                    subplot_kw=dict(polar=True),
                                    gridspec_kw={'wspace': -0.3})
fig.subplots_adjust(bottom=0.15, right=0.85) 
axs = [ax1, ax2, ax3]

r = np.linspace(0.5, r_out, 20)
theta = np.linspace(-np.pi, np.pi, 20)
data_to_plot = np.array([[r[i]**2 * np.sin(theta[j]) for i in range(np.size(r))] for j in range(np.size(theta))])
R, T = np.meshgrid(r, theta)
X, Y = R*np.cos(T), R*np.sin(T)

r_lim = (-r_out-0.1, r_out+0.1)
for i in range(len(axs)):
    ax = axs[i]
    ax.axis('off')
    new_axis = fig.add_axes(ax.get_position().bounds,ylim=r_lim,xlim=r_lim,aspect='equal')
    cont = new_axis.contourf(X, Y, np.squeeze(data_to_plot), levels=level, cmap='coolwarm')
    if i == 0:
        new_axis.set_ylabel(r"$y$", fontsize=18)
    new_axis.set_xlabel(r"$x$", fontsize=18)
    if i != 0:
        new_axis.set_yticklabels([])
        new_axis.set_yticks([])
    new_axis.tick_params(axis="both", labelsize=18)
    new_axis.set_title(axis_text[i], fontsize=20)

fig.subplots_adjust(right=0.89) 

cbar = fig.colorbar(cont, ax=axs[2])
cbar.set_ticks(np.linspace(level.min(), level.max(), 5))
cbar.ax.tick_params(labelsize=18)
cbar.ax.set_ylabel(r"$u_r$", fontsize = 22)

plt.show()

方案2:直接创建笛卡尔子图(更简洁)

完全跳过极坐标子图的创建,直接生成笛卡尔子图并设置aspect='equal',此时wspace等常规间距参数可直接控制子图间空白:

import numpy as np
import matplotlib.pyplot as plt

r_out = 6.0
level = np.linspace(-100,100,30)

axis_text = [r"$t/t_A = 0$", r"$t/t_A = 30$", r"$t/t_A = 60$"]

# 直接创建笛卡尔子图,设置aspect='equal'并调整wspace
fig, [ax1, ax2, ax3] = plt.subplots(1,3,figsize=(15,4), 
                                    subplot_kw=dict(aspect='equal'),
                                    gridspec_kw={'wspace': 0.05})
fig.subplots_adjust(bottom=0.15, right=0.85) 
axs = [ax1, ax2, ax3]

r = np.linspace(0.5, r_out, 20)
theta = np.linspace(-np.pi, np.pi, 20)
data_to_plot = np.array([[r[i]**2 * np.sin(theta[j]) for i in range(np.size(r))] for j in range(np.size(theta))])
R, T = np.meshgrid(r, theta)
X, Y = R*np.cos(T), R*np.sin(T)

r_lim = (-r_out-0.1, r_out+0.1)
for i in range(len(axs)):
    ax = axs[i]
    ax.set_ylim(r_lim)
    ax.set_xlim(r_lim)
    cont = ax.contourf(X, Y, np.squeeze(data_to_plot), levels=level, cmap='coolwarm')
    if i == 0:
        ax.set_ylabel(r"$y$", fontsize=18)
    ax.set_xlabel(r"$x$", fontsize=18)
    if i != 0:
        ax.set_yticklabels([])
        ax.set_yticks([])
    ax.tick_params(axis="both", labelsize=18)
    ax.set_title(axis_text[i], fontsize=20)

fig.subplots_adjust(right=0.89) 

cbar = fig.colorbar(cont, ax=axs[2])
cbar.set_ticks(np.linspace(level.min(), level.max(), 5))
cbar.ax.tick_params(labelsize=18)
cbar.ax.set_ylabel(r"$u_r$", fontsize = 22)

plt.show()

说明

  • 方案1保留了你原有的“先极坐标再替换”逻辑,通过调整原subplot的间距间接压缩新笛卡尔轴的空白。
  • 方案2更高效,因为你最终需要的是笛卡尔坐标系下的极坐标转换数据,无需额外创建极坐标子图,所有常规布局参数均可正常生效。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:40:53