matplotlib中的axes.set_aspect('equal')没有像预期的那样运作。

10

我需要在matplotlib中绘制一个图,其中两个轴始终具有相同的长度。为此,我使用了“equal”选项。在大多数情况下,它工作得非常好,我得到了预期的结果(请参见图1),但是当y轴的值比x轴高得多时,图表显示出意外的行为(请参见图2)。有没有人知道matplotlib的这种行为?

谢谢,Jörg

        host = SubplotHost(fig, 111)
        try:
            min_x_val = min(x for x in self.x_values if x is not None)
            max_x_val = max(self.x_values)
        except ValueError:
            return

        max_y_val = list()
        for n, evaluator in enumerate(self.cleaned_evaluators):
            max_y_val.append(max(self.y_values[n]))

        # axis settings
        host.axis['left'].label.set_fontsize('small')
        host.axis['left'].major_ticklabels.set_fontsize('small')
        host.axis['bottom'].label.set_fontsize('small')
        host.axis['bottom'].major_ticklabels.set_fontsize('small')
        host.axis['bottom'].major_ticklabels.set_rotation(0)
        host.set_ylabel(y_label)
        host.set_xlabel(x_label)


        host.set_xlim(0, max_x_val)
        host.set_ylim(0, max_y_val)

        host.minorticks_on()
        host.toggle_axisline(False)
        host.axes.set_aspect('equal')
        host.grid(True, alpha=0.4)

        return fig

图1:

正常情况

图2:

异常情况


3
实际上,它表现出了预期的行为。set_aspect('equal') 的意思是,在您的图1中可以看到,x轴上的一个单位长度与y轴上的一个单位长度相等。 - sodd
您可以将数字值传递给 set_aspect,请参阅文档。通过取 xy 的商,您应该能够缩放轴,使它们具有相同的长度。 - Bakuriu
请注意,您的第一个示例(图1)实际上不是正方形;它大约有430像素宽,400像素高。这与两个轴的略微不同的数据范围一致(x轴为0到3.5,y轴为0到3.25),因为set_aspect('equal')强制为两个轴使用相同的数据缩放(每像素数据值)。 - Peter Erwin
可能是具有不同y轴的子图中的纵横比的重复问题。 - jdhao
1个回答

20

equal 表示在数据坐标系中,x 和 y 维度的长度相同。要获得正方形轴,您可以手动设置它们的长宽比:

ax.set_aspect(1./ax.get_data_ratio())

3
请注意,此命令必须出现在绘图命令之后。 - Peaceful

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接