我用冗长的名字在一个分类热图上标注了一个颜色条。打印时,这些名称不完全可见plt.tight_layout()
打破了元素的排列,有时不显示热图记号,或者将颜色条和热图缩放到不合适的比例。我怎样才能在不引入这些其他问题的情况下,自动地使数字变大呢
下面是一个示例:
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
import matplotlib
n_labs = 4
labels = np.floor(np.random.rand(10, 10) * n_labs)
names = np.array(['a'*20] * n_labs)
bounds = np.linspace(-0.5, n_labs - 0.5, n_labs + 1)
norm = matplotlib.colors.BoundaryNorm(bounds, n_labs)
fmt = matplotlib.ticker.FuncFormatter(
lambda z, pos: names[norm(z)]
)
plt.figure()
plt.suptitle('Title')
sns.heatmap(
labels, cmap=plt.get_cmap('copper', n_labs), square=True, linewidths=1, vmax=n_labs,
cbar_kws=dict(
ticks=np.arange(n_labs), format=fmt,
boundaries=bounds, drawedges=True
),
)
plt.tight_layout()
plt.show()
无tight_layout
和有tight_layout
的结果:
在我看来,seaborn正在做一些奇怪的边界盒计算;尽管如此,我对
plt.tight_layout()
的“聪明猜测”也有很多问题,以前,我通常使用gridspec
来对图形布局进行更精细的控制(还有控制多个子图的额外好处):----------
为了使事情或多或少自动化,请尝试如下打印:
在这里,您将创建两个子图(
ax
和cbar_ax
),其中width_ratio
是20:1
,然后告诉sns.heatmap
实际使用这些轴plt.tight_layout()
似乎工作得更好,并且尽可能自动,但仍然会遇到问题(例如,通过设置figsize=(2,2)
它将抛出ValueError: left cannot be >= right
相关问题 更多 >
编程相关推荐