以编程方式调整绘图宽度以适应y轴编号

时间:2014-09-17 04:01:24

标签: python matplotlib graphing

我正在绘制一个图表,其中y轴上的数字可能会变化很大,需要一种方法来以编程方式确定一个好的绘图宽度,以便它们适合。我目前正在使用以下可怕的黑客攻击,但它不是很强大。例如,如果yminymax为1和2,那么这些都是1位数字,但实际的刻度标签将是" 1.3"。有没有办法获得matplotlib实际使用的刻度标签列表,仅给出yminymax

ymin, ymax = 1, 1e8

nd = max(len(str(ymin)),  # number of digits (at most) in y-axis numbers
         len(str(ymax)))
wN = .05 + .01*nd # width of the numbers on the y-axis ticks (ymin to ymax)

plt.axes([wN, .06, 1-wN-.01, 1-.12]) # [left, bottom, width, height]
plt.ylabel("the y-axis label")
yticker = matplotlib.ticker.ScalarFormatter()
yticker.set_scientific(False)
plt.gca().yaxis.set_major_formatter(yticker)

plt.axis([0, 9, ymin, ymax])

Plot with not enough room left for the y-axis tick labels

2 个答案:

答案 0 :(得分:2)

要获取刻度值,请使用

plt.xticks()
plt.yticks()

这将显示图中的值。您可以手动更改它们,例如

plot.yticks(linspace(ymin,ymax,10))

会在yminymax之间为您提供10个均匀间隔的刻度。

有一种方法可以手动设置标签。例如,您可能需要以下刻度值

tick_vals = numpy.linspace(0,1,4)

显示为[0.0, .33, 0.67, 1.0],您可以使用round功能设置刻度标签。参数2表示舍入到两位数:

tick_labels = [round(tick_vals[i],2) for i in range(len(tick_vals))]

然后使用

设置刻度标签
plt.yticks(tick_vals, tick_labels)

实际的y轴将缩放以匹配tick_vals设置的值,但它们将根据tick_labels重新标记。在这种情况下,您负责确保您的刻度标签实际上代表轴上的内容。


注意:我使用过

import matplotlib.pyplot as plt
import numpy

在这个答案中。

答案 1 :(得分:1)

从matplotlib 1.1开始,有一个

tight_layout() # or fig.tight_layout() -- depending on the interface
               #                          You are using

并自动调整宽度。它允许指定填充:请参阅the docs

有时需要手动调整边距:例如,当您将图例放在轴外时。在这种情况下,可以调用

subplots_adjust(bottom=0.1, top=0.9, left=0.1, right=0.95) # or fig.subplots_adjust ...

但请注意,必须在savefigshow之前调用这两个命令。