删除matplotlib子图中的额外图

velaa5lx  于 2023-05-18  发布在  其他
关注(0)|答案(6)|浏览(95)

我想在2乘3设置中绘制5个 Dataframe (即2行和3列)。这是我的代码:然而,在第6个位置(第二行和第三列)有一个额外的空图,我想摆脱它。我想知道如何删除它,以便我在第一行有三个地块,在第二行有两个地块。

import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=2, ncols=3)

fig.set_figheight(8)
fig.set_figwidth(15)


df[2].plot(kind='bar',ax=axes[0,0]); axes[0,0].set_title('2')

df[4].plot(kind='bar',ax=axes[0,1]); axes[0,1].set_title('4')

df[6].plot(kind='bar',ax=axes[0,2]); axes[0,2].set_title('6')

df[8].plot(kind='bar',ax=axes[1,0]); axes[1,0].set_title('8')

df[10].plot(kind='bar',ax=axes[1,1]); axes[1,1].set_title('10')

plt.setp(axes, xticks=np.arange(len(observations)), xticklabels=map(str,observations),
        yticks=[0,1])

fig.tight_layout()

6uxekuva

6uxekuva1#

试试这个:

fig.delaxes(axes[1][2])

创建子图更灵活的方法是fig.add_axes()方法。参数是一个rect坐标列表:fig.add_axes([x, y, xsize, ysize])。这些值是相对于画布大小的,因此xsize0.5意味着子图的宽度是窗口的一半。

9njqaruj

9njqaruj2#

或者,使用axes方法set_axis_off()

axes[1,2].set_axis_off()
kpbwa7wx

kpbwa7wx3#

如果你知道要删除哪个图,你可以给予索引并删除如下:

axes.flat[-1].set_visible(False) # to remove last plot
myss37ts

myss37ts4#

关闭所有轴,并仅在绘制坐标轴时逐个打开坐标轴。那么你不需要提前知道指数,例如:

import matplotlib.pyplot as plt

columns = ["a", "b", "c", "d"]
fig, axes = plt.subplots(nrows=len(columns))

for ax in axes:
    ax.set_axis_off()

for c, ax in zip(columns, axes):
    if c == "d":
        print("I didn't actually need 'd'")
        continue

    ax.set_axis_on()
    ax.set_title(c)

plt.tight_layout()
plt.show()

kfgdxczn

kfgdxczn5#

以前的解决方案不适用于sharex=True。如果你有,请考虑下面的解决方案,它也涉及二维子图布局。

import matplotlib.pyplot as plt

columns = ["a", "b", "c", "d"]
fig, axes = plt.subplots(4,1, sharex=True)

plotted = {}
for c, ax in zip(columns, axes.ravel()):
    plotted[ax] = 0
    if c == "d":
        print("I didn't actually need 'd'")
        continue
    ax.plot([1,2,3,4,5,6,5,4,6,7])
    ax.set_title(c)
    plotted[ax] = 1

if axes.ndim == 2:
    for a, axs in enumerate(reversed(axes)):
        for b, ax in enumerate(reversed(axs)):
            if plotted[ax] == 0:
                # one can use get_lines(), get_images(), findobj() for the propose
                ax.set_axis_off()
                # now find the plot above
                axes[-2-a][-1-b].xaxis.set_tick_params(which='both', labelbottom=True)
            else:
                break # usually only the last few plots are empty, but delete this line if not the case
else:
    for i, ax in enumerate(reversed(axes)):
        if plotted[ax] == 0:
            ax.set_axis_off()
            axes[-2-i].xaxis.set_tick_params(which='both', labelbottom=True)
            # should also work with horizontal subplots
            # all modifications to the tick params should happen after this
        else:
            break

plt.show()

二维fig, axes = plot.subplots(2,2, sharex=True)

r7knjye2

r7knjye26#

Johannes的答案的一个更懒的版本是删除任何没有添加数据的坐标轴。这避免了维护要移除哪些轴的规范。

[fig.delaxes(ax) for ax in axes.flatten() if not ax.has_data()]

相关问题