如何绘制用于分组子图的括号

Posted

技术标签:

【中文标题】如何绘制用于分组子图的括号【英文标题】:How to draw a bracket for grouping subplots 【发布时间】:2021-12-10 22:56:58 【问题描述】:

我想绘制/绘制一个“括号”(为简单起见,它是形成弧的一系列点),如第一张图片中的红色所示。

我在另一个图中创建了括号,但我不知道如何在第一个图中包含/绘制/绘制它。这是括号,它会根据需要进行转换以适应小标签和标签组之间的空间。

这是 MWE:

import matplotlib.pyplot as plt
import numpy as np

fig, axs = plt.subplots(8, 1, figsize=(8,9), sharex=True)
for i, ax in enumerate(axs.flat):
    ax.plot([1,2])
    ax.set_ylabel('Label ' + str(i))
axs[7].set_xlabel('The common x Label')

plt.annotate('Group Label (0,1,2,3)', xy=(.02, 0.7), rotation=90, xycoords='figure fraction',
            horizontalalignment='center', verticalalignment='center', fontsize=14, color='k')
plt.annotate('Group Label (4,5,6,7)', xy=(.02, 0.3), rotation=90, xycoords='figure fraction',
            horizontalalignment='center', verticalalignment='center', fontsize=14, color='k')

# Plot a 'bracket'
plt.figure()
npoints = 100
td = np.linspace(np.pi*3/4, np.pi*5/4, npoints)
xd = np.cos(td)
yd = np.sin(td)
plt.plot(xd,yd)

编辑: 我相信使用 PathPatch 将是最好的解决方案,就像在这个 Matplotlib example 中一样。我只是不知道该怎么做。

【问题讨论】:

可能是这样的answer。似乎最好只有两个子图并在每个子图中绘制四个组,线条由图例/颜色区分。 我很确定使用“补丁”可能是一个有效的解决方案,只是不知道该怎么做。 @paul-brodersen 你能帮忙找出补丁解决方案吗? 【参考方案1】:

您可以通过使用plt.GridSpec 并使用plt.box(False)plt.xticks([])plt.yticks([]) 屏蔽支架的轴来实现此目的。括号的弧也可以通过改变子图的大小来改变。下面是代码的样子:

import matplotlib.pyplot as plt
import numpy as np

fig= plt.figure(figsize=(10,10))

gs=plt.GridSpec(16,5)
for k in range(8):
  plt.subplot(gs[2*k:2*k+2,1:5])
  plt.plot([1,2],[1,2])
  plt.ylabel('Label ' + str(k))
  if k==7:
    plt.xlabel('The common x Label')


plt.subplot(gs[0:8,0:1])
npoints = 100
td = np.linspace(np.pi*3/4, np.pi*5/4, npoints)
xd = np.cos(td)
yd = np.sin(td)
plt.plot(xd,yd)
plt.box(False)
plt.xticks([])
plt.yticks([])

plt.subplot(gs[8:16,0:1])
plt.plot(xd,yd)
plt.box(False)
plt.xticks([])
plt.yticks([])
plt.tight_layout()



plt.annotate('Group Label (0,1,2,3)', xy=(.015, 0.75), rotation=90, xycoords='figure fraction',
            horizontalalignment='center', verticalalignment='center', fontsize=14, color='k')
plt.annotate('Group Label (4,5,6,7)', xy=(.015, 0.3), rotation=90, xycoords='figure fraction',
            horizontalalignment='center', verticalalignment='center', fontsize=14, color='k')

输出给出:

【讨论】:

当然,这是一种解决方法。但顺便说一句,“常见的 x 标签”不再适用于 x 标签了…… 如果您想删除前 7 个子图的 x 轴上的刻度,您可以仅在 for 循环的前 7 次迭代中添加 plt.xticks([])。然后输出将与您的输出非常相似。 更多的是行为而不是美学。在我的 MWE 中,它们都共享相同的 x,这意味着,例如,当您放大一个轴时,所有其他轴也会放大。

以上是关于如何绘制用于分组子图的括号的主要内容,如果未能解决你的问题,请参考以下文章

分组条形图的子图分组图例

R语言ggplot2可视化百分比显示实战:纵轴显示为百分比在柱状图上显示百分比按照因子变量绘制分组子图(纵轴显示为百分比)可视化图中显示数据百分比

python 如何绘制子图的同时绘制双坐标轴图像

R语言ggplot2可视化绘制分组水平条形图并在条形图的各种位置添加数值标签实战

如何在plotly中跨子图对齐分组箱线图

来自按级别分组的多索引熊猫数据框的子图