我有以下matplotlib代码,它所做的只是在x轴上绘制0-20,在y轴上绘制0-100
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(20))
ax.set_yticks(range(100))
labels = ax.set_yticklabels(range(100))
我遇到的问题是并非所有标签实际上都适合y轴。
我想要做的是将最大标签大小划分为图的总面积,以计算我可以放置多少标签,然后我可以将我的数据分组到0-10,10-20,30-部分40并绘制那些而不是显示单个标签1,2,3,4,5,6,7,8 ......
我无法找到标签的标签大小和图形的标签大小(如果我错了,请纠正我,也许是轴大小,以像素为单位。这是我第一次使用matplotlib)
如何找出图形/轴占用的像素数(宽度+高度)以及每个标签的像素数(宽度+高度)?
答案 0 :(得分:4)
只需添加以下行:
plt.tight_layout()
答案 1 :(得分:2)
您可以使用ax.get_position()
获取地块中的轴范围,请参阅axes
上的文档(我会发布链接,但我目前的声誉不允许)。
tick标签大小是相对于字体大小在matplotlibrc文件中定义的。查看一些详细信息here。默认大小为12pt,可以使用
进行更改plt.rcParams['ytick.labelsize'] = small
来自标准的matplotibrc文件:
可以定义特殊文字大小 相对于font.size,使用以下值:xx-small,x-small, 小,中,大,x大,xx大,大或小
解决问题的最简单方法可能是使用
更改总数字大小fig = plt.figure(figsize=(10,30))
在您的情况下使用以下result(请注意,该示例有点极端)。如果有这么多的标签,你必须增加总数字大小,你应该考虑减少如上所示的ticklabel大小或减少ticklabel的数量。
请注意,此过程涉及手动调整总图和/或刻度标签的大小,直到获得所需的输出。如果有更好的方法,我会很高兴看到它。
您可以使用plt.savefig(output.png)
在当前工作目录中保存地块。如果您使用plt.show()
并且图像大于弹出窗口,则标签将始终混乱,因为总数会缩小到窗口大小,但标签大小保持不变。
我希望这个答案对你有所帮助。
答案 2 :(得分:1)
另一种选择是将其他所有标签稍微向左推。除了较小的yticklabel大小以外,这看起来还不错:
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
# Generate some random data
labels = 'abcdefghijklmnopqrstuvwxyz'
data = np.random.random((len(labels), 100))
# Plot it, setting the ticklabel size temporarily
# this is helpful for adjusting your plot until it's right
# without having an influence on other plots outside the context
with mpl.rc_context(rc={'ytick.labelsize': 6}):
fig, ax = plt.subplots(1, 1, figsize=(6.5,5))
im = ax.imshow(data)
# Plot the labels on the yaxis
ax.set_yticks(range(len(labels)))
# Every second label gets a bit of whitespace to the right
# thus effectively it is pushed to the left
labels_formatted = [label if i%2==0 else label+' '*3 for i,label in enumerate(labels)]
ax.set_yticklabels(labels_formatted)