import matplotlib.pyplot as plt
cols = ['Column {}'.format(col) for col in range(1, 4)]
rows = ['Row {}'.format(row) for row in ['A', 'B', 'C', 'D']]
fig, axes = plt.subplots(nrows=4, ncols=3, figsize=(12, 8))
for ax, col in zip(axes[0], cols):
ax.set_title(col)
for ax, row in zip(axes[:,0], rows):
ax.set_ylabel(row, rotation=0, size='large')
fig.tight_layout()
plt.show()
import matplotlib.pyplot as plt
from matplotlib.transforms import offset_copy
cols = ['Column {}'.format(col) for col in range(1, 4)]
rows = ['Row {}'.format(row) for row in ['A', 'B', 'C', 'D']]
fig, axes = plt.subplots(nrows=4, ncols=3, figsize=(12, 8))
plt.setp(axes.flat, xlabel='X-label', ylabel='Y-label')
pad = 5 # in points
for ax, col in zip(axes[0], cols):
ax.annotate(col, xy=(0.5, 1), xytext=(0, pad),
xycoords='axes fraction', textcoords='offset points',
size='large', ha='center', va='baseline')
for ax, row in zip(axes[:,0], rows):
ax.annotate(row, xy=(0, 0.5), xytext=(-ax.yaxis.labelpad - pad, 0),
xycoords=ax.yaxis.label, textcoords='offset points',
size='large', ha='right', va='center')
fig.tight_layout()
# tight_layout doesn't take these labels into account. We'll need
# to make some room. These numbers are are manually tweaked.
# You could automatically calculate them, but it's a pain.
fig.subplots_adjust(left=0.15, top=0.95)
plt.show()
4条答案
按热度按时间92vpleto1#
有几种方法可以做到这一点。简单的方法是利用图的y标签和标题,然后使用
fig.tight_layout()
为标签腾出空间。或者,您可以使用annotate
将其他文本放置在正确的位置,然后半手动地为其腾出空间。如果轴上没有y标签,则很容易利用轴的第一行和第一列的标题和y标签。
字符串
的数据
如果您确实有y标签,或者如果您希望更灵活一点,您可以使用
annotate
来放置标签。这是更复杂的,但允许您有单独的情节标题,ylabels等,除了行和列标签。型
的
pnwntuvh2#
基于Joe Kington's answer,我提出了一个可以在代码库中重用的函数:
它接受以下参数:
fig
:包含要处理的轴的图形row_headers
、col_headers
:作为标头的字符串序列row_pad
、col_pad
:int
调整填充的值rotate_row_headers
:是否将行标题旋转90°**text_kwargs
:转发到ax.annotate(...)
函数在这里,下面的例子:
字符串
下面是一个在标准网格上使用它的例子(没有轴跨越多行/列):
型
x1c 0d1x的数据
如果某些轴跨越多个行/列,则正确分配行/列标题就不那么简单了。我没有设法从函数内部整理出来,但是小心给定的
row_headers
和col_headers
参数足以使它轻松工作:型
的
jutyujz03#
上述答案是可行的。只是在第二个版本的答案中,你没有想到:
字符串
而不是:
型
ny6fqffe4#
作为Joe答案的扩展,您可以使用Y标签方法,即使是使用现有的Y标签,我发现这比使用
annotate
容易得多,特别是当轴不在规则网格上时。为此,您可以twin轴并将其向左移动:
字符串
当然,如果你也有现有的标题,你可以对X轴做同样的事情,在顶部添加额外的标签。
输出量:
的数据
非规则网格上的输出:
的