matplotlib / python:为多个子图强制轴​​的长度相同

时间:2017-05-04 16:19:28

标签: python matplotlib

我想要一个SQUARED散点图,每个图有4个子图。如果x和y轴具有相同的范围,我想出了如何做到这一点:

f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
for x in [ax1, ax2, ax3, ax4]:
    x.set_adjustable('box-forced')
    x.set_aspect('equal')

但是,如果x和y轴具有不同的范围,则这不起作用,因为x中的一个单位在图中的长度与y中的一个单位相同。

我已经看到使用plt.subplots_adjust()来改变轴长度,但如果我已经有多个子图,我就不知道它是如何工作的。

有什么想法吗?我很惊讶设置一个数字大小是多么容易,设置轴长度是多么棘手。

谢谢!

编辑: 以下是一些显示问题的代码:

import matplotlib.pyplot as plt
import numpy as np

f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
# All data within 0-25, 25-50, 50-75, 75-100 should be plotted on respective subplot
layers = [(ax4, (0., 25.)), (ax3, (25., 50.)), (ax2, (50.., 75.)), (ax1, (75., 100.))]

# make subplot squared:
for x in layers:
    x[0].set_adjustable('box-forced')
    x[0].set_aspect('equal')

# loop over multiple files containing data, here reproduced by creating a random number 100 times:
for x in np.arange(100):
    data = np.random.random(10)*100.
    for pl in layers:
        ii = np.where((data>=pl[1][0]) & (pl[1][1]>data))[0]
        pl[0].scatter(data[ii], data[ii])
plt.show()

这产生了一个带有平方子图的图: 平方子图(x轴和y轴具有相同的范围)1

使用与上面完全相同的代码,但绘制数据[ii]对比(数据[ii])** 2给出了x和y的不同轴范围的图,并改变了平方形状:

x和y具有不同的范围,并且图表被挤压2

我想得到情节1的形状和情节2的数据。

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以将纵横比设置为图表的x和y限制的比率。这将给你一个方形图。

import matplotlib.pyplot as plt
import numpy as np

f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
# All data within 0-25, 25-50, 50-75, 75-100 should be plotted on respective subplot
layers = [(ax4, (0., 25.)), (ax3, (25., 50.)), (ax2, (50., 75.)), (ax1, (75., 100.))]

# loop 
for x in np.arange(100):
    data = np.random.random(10)*100.
    for pl in layers:
        ii = np.where((data>=pl[1][0]) & (pl[1][1]>data))[0]
        pl[0].scatter(data[ii], data[ii])
        x0,x1 = pl[0].get_xlim()
        y0,y1 = pl[0].get_ylim()
        pl[0].set_aspect( (x1-x0)/(y1-y0) )
plt.show()

enter image description here