我有下面的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)
我怎样才能知道图形/轴占用的像素数(宽度+高度)以及每个标签的像素数(宽度+高度)?
4条答案
按热度按时间py49o6xq1#
只需添加以下行:
plt.tight_layout()
w8f9ii692#
你可以用
ax.get_position()
来获取坐标轴的范围,参见axes
的文档(我会发布一个链接,但我目前的声誉不允许)。刻度标签大小是在matplotlibrc文件中相对于字体大小定义的。详细信息here默认大小为12 pt,可以使用
从标准的matplotibrc文件:
可以使用以下值相对于font.size定义特殊文本大小:xx-小,x-小,小,中,大,x-大,xx-大,更大,或更小
解决问题的最简单方法可能是使用
在您的情况下使用以下result(注意,该示例有点极端)。如果有太多的ticklabel,你必须增加总的数字大小这么多,你应该考虑减少ticklabel大小如上所示或减少ticklabel的数量。
请注意,此过程涉及手动调整总图和/或标记的大小,直到获得所需的输出。如果有更好的方法,我很乐意看到。
您可以使用
plt.savefig(output.png)
将绘图保存在当前工作目录中。如果你使用plt.show()
,并且图像比弹出窗口大,标签总是会被弄乱,因为总的图形缩小到窗口大小,但标签大小保持不变。我希望这个答案对你有帮助。
zxlwwiss3#
此答案适用于Matplotlib版本3.5.2
我怎样才能知道图/轴所占的像素数(宽度+高度)
全图大小(像素):
该图也有一个
bbox
,这是由__repr__
方法打印的图的大小。没有弄清楚这两者之间的全部区别,但这是如何获得bbox
的像素大小:以及每个标签的像素数(宽度+高度)?
可以使用
get_window_extent
方法来获取边界框的大小。因此,要获取轴和标签的像素大小和左下角位置(X向右正,Y向上正):作为一个动态的解决方案,使tick标签显示为过度拥挤的tick标签,我们探索了两种方法:
1.减小字体大小以使所有刻度可见->这具有对于刻度数量和图形大小的特定组合具有难以辨认的刻度标签的缺点
1.跳过记号标签以防止重叠->这具有并非所有Y值都将具有标签的缺点
对于这两个方法,我们需要以下代码(从OP的示例开始):
减小字体大小,使所有刻度可见
以OP为例的结果;标签难以辨认:
跳过勾号标签,防止重叠
我认为使用matplotlib.ticker可以完成与这里描述的相同的事情。在不方便的情况下,仍然可以期望使用这个。我的用例是使用一个seaborn热图,其中自定义格式化的日期时间作为y tick标签。
跳过标签的结果:
m3eecexj4#
另一种选择是将每隔一个标签稍微向左推。除了一个更小的yticklabel大小,这可以看起来很好: