将文本添加到Matplotlib图中时自动调整图限制

时间:2019-01-24 14:50:20

标签: python matplotlib plot jupyter-notebook

当我向matplotlib图中添加文本时,该文本超出了轴的当前限制,则轴不会调整,文本将位于图的轴之外。我有什么办法(几乎)自动调整轴的限制,以使文本落入轴内?

这是一个最小的(非工作)示例:

vm.saveRecord = function() {
    var services = { function1, function2, function3, function4 },
        service = vm.valueTrue
            ? vm.otherValue
                ? 'function1'
                : 'function2'
            : vm.otherValue
                ? 'function3'
                : 'function4';

    services[service].callEndPoint(param1, param2).then(
        function successCallback(response) {
            if(response) {
                //successful response
            }
        }, function errorCallback(response) {
            //error
        }
    )
};

A plot with the issues described above.

最小的例子当然是人为的,可以手动解决。在我的真实情况下:

  • 此过程在不同数据上重复多次。经常重复进行,以至于我不想为每种情况手动找出好的限制。
  • 文本的位置是有意义的并且基于数据,因此将文本移动到轴内的某个位置没有意义-我需要更改轴以适合文本。

注意:本身,这没什么大问题,但是我特别要结合使用matplotlib和Jupyter笔记本以及import numpy as np import matplotlib.pyplot as plt plt.figure() plt.scatter([1, 2, 3, 4, 5], [3, 2, 4, 1, 5]) plt.text(5, 3, "This text goes outside the plot.") plt.text(3, 6, "This text is entirely outside the plot.") plt.show() 命令,在该图中图形的可见部分仅限于轴内的零件(带有一些填充)。结果,上面添加的两个文本行被切断或根本不可见。

Plot with issues described above.

不过,我觉得这是两个独立的问题,因此在一个问题中处理两个问题可能不合适。如果我能解决前一个问题,我认为后者也会解决。

3 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

axes = plt.gca()
axes.set_xlim([xmin,xmax])
axes.set_ylim([ymin,ymax])

设置轴的极限。如果将这些限制存储为变量,则可以将文本设置为相对于这些变量。例如,如果您设置:

xmax, ymax = 10, 10

然后,您可以将文本设置为xmax - 2ymax - 2之类的位置。

这将使您的绘图更大,并确保文本在其中。

如果您不知道绘图的大小(例如,您不知道数据的限制),则可以自动找到数据的最大值(使用max());加一点,使地块比需​​要的大;然后执行以上操作。

答案 1 :(得分:0)

我将使用的最直接的解决方案是,通过使用其他表示方法(例如imagemagick)添加标题,以在情节之外进行注释。

答案 2 :(得分:0)

我不确定您要在哪里放置文本,但是请尝试以下操作:

import numpy as np
import matplotlib.pyplot as plt

plt.figure()

x = [1, 2, 3, 4, 5]
y = [3, 2, 4, 1, 5]
plt.scatter(x,y)

minx,maxx = min(x),max(x)
miny,maxy = min(y),max(y)

plt.text(minx,miny, "This text goes outside the plot. If you have a longer text,\n you can do a line break.")
plt.text(minx,maxy, "This text is entirely outside the plot.")
plt.show()

This is the result