使用 matplotlib 重塑图中的轴
Reshape axes in figure using matplotlib
我正在使用库中的一种方法,该库使用 matplotlib 生成图形。
我收到一个轴数组:
[<matplotlib.axes._axes.Axes at 0x117a32a90>,
<matplotlib.axes._axes.Axes at 0x117bb1d68>,
<matplotlib.axes._axes.Axes at 0x10bae8390>,
<matplotlib.axes._axes.Axes at 0x10bb0add8>,
<matplotlib.axes._axes.Axes at 0x10c153898>,
<matplotlib.axes._axes.Axes at 0x1159412e8>,
<matplotlib.axes._axes.Axes at 0x115964d30>]
在原图中,所有轴都在同一行(参见第一张图并想象在右侧有另外两个轴)。我想重塑(à la numpy)图形以创建轴网格(参见第二个图)。
可能吗?
更新 - 我试过的
在 this answer 之后,我尝试使用 GridSpec:
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
fig = plt.figure()
axs = #get list of axes
gs = gridspec.GridSpec(3,3)
for i in range(3):
for j in range(3):
k = i+j*3
if k < len(axs):
axs[k].set_position(gs[k].get_position(fig))
fig.add_subplot(gs[k])
但是不行,我对GridSpec还没有完全掌握。该图显示了正确数量的子图,但没有添加坐标轴。
我想你快到了。不知道你的绘图功能是什么,我只是做了一个虚拟的来说明。
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
def dummy_plots():
"""
Return a 1d array of dummy plots.
"""
_, ax_arr = plt.subplots(1, 9)
for ax in ax_arr.flat:
ax.plot([0, 1], [0, 1])
return ax_arr
axs = dummy_plots()
fig = plt.gcf()
gs = gridspec.GridSpec(3,3)
for i in range(3):
for j in range(3):
k = i+j*3
if k < len(axs):
axs[k].set_position(gs[k].get_position(fig))
plt.show()
我发现在很多情况下更容易的是:
import numpy as np
import matplotlib.pyplot as plt
f, ax = plt.subplots(2, 2)
# make 1d for easier access
ax = np.ravel(ax)
for i in range(4):
ax[i].plot([0,1], [0, 1], c=f"C{i}")
# reshape to initial dimensions
ax = np.reshape(ax, (2, 2))
我正在使用库中的一种方法,该库使用 matplotlib 生成图形。
我收到一个轴数组:
[<matplotlib.axes._axes.Axes at 0x117a32a90>,
<matplotlib.axes._axes.Axes at 0x117bb1d68>,
<matplotlib.axes._axes.Axes at 0x10bae8390>,
<matplotlib.axes._axes.Axes at 0x10bb0add8>,
<matplotlib.axes._axes.Axes at 0x10c153898>,
<matplotlib.axes._axes.Axes at 0x1159412e8>,
<matplotlib.axes._axes.Axes at 0x115964d30>]
在原图中,所有轴都在同一行(参见第一张图并想象在右侧有另外两个轴)。我想重塑(à la numpy)图形以创建轴网格(参见第二个图)。
可能吗?
更新 - 我试过的
在 this answer 之后,我尝试使用 GridSpec:
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
fig = plt.figure()
axs = #get list of axes
gs = gridspec.GridSpec(3,3)
for i in range(3):
for j in range(3):
k = i+j*3
if k < len(axs):
axs[k].set_position(gs[k].get_position(fig))
fig.add_subplot(gs[k])
但是不行,我对GridSpec还没有完全掌握。该图显示了正确数量的子图,但没有添加坐标轴。
我想你快到了。不知道你的绘图功能是什么,我只是做了一个虚拟的来说明。
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
def dummy_plots():
"""
Return a 1d array of dummy plots.
"""
_, ax_arr = plt.subplots(1, 9)
for ax in ax_arr.flat:
ax.plot([0, 1], [0, 1])
return ax_arr
axs = dummy_plots()
fig = plt.gcf()
gs = gridspec.GridSpec(3,3)
for i in range(3):
for j in range(3):
k = i+j*3
if k < len(axs):
axs[k].set_position(gs[k].get_position(fig))
plt.show()
我发现在很多情况下更容易的是:
import numpy as np
import matplotlib.pyplot as plt
f, ax = plt.subplots(2, 2)
# make 1d for easier access
ax = np.ravel(ax)
for i in range(4):
ax[i].plot([0,1], [0, 1], c=f"C{i}")
# reshape to initial dimensions
ax = np.reshape(ax, (2, 2))