Matplotlib:调整刻度以适合图形

时间:2016-03-27 21:11:44

标签: python matplotlib figure

我有以下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)

如何找出图形/轴占用的像素数(宽度+高度)以及每个标签的像素数(宽度+高度)?

plot

3 个答案:

答案 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)

enter image description here