将所有子图的y轴设置为相同的范围 - Matplotlib

时间:2016-04-04 19:23:52

标签: python matplotlib range axis

我想知道如何强制我的子图分享y轴范围。 这是我的代码:

f, axes = plt.subplots(7, 1, sharex='col', sharey='row', figsize=(15, 30))
distance = []

for i in range(simulations):
    delta = numpy.zeros((simulations+samples, simulations+samples))
    data_x = sample_x[i*samples:(i*samples)+samples] + ensamble_x
    data_y = sample_y[i*samples:(i*samples)+samples] + ensamble_y
    for j in range(simulations+samples):
        for k in range(simulations+samples):
            if j <= k:
                dist = similarity_measure((data_x[j].flatten(), data_y[j].flatten()), (data_x[k].flatten(), data_y[k].flatten()))
                delta[j, k] = delta[k, j] = dist

    delta = 1-((delta+1)/2)  
    delta /= numpy.max(delta)
    model = manifold.TSNE(n_components=2, random_state=0, metric='precomputed')
    coords = model.fit_transform(delta)

    mds = manifold.MDS(n_components=2, max_iter=3000, eps=1e-9, random_state=0,
                   dissimilarity="precomputed", n_jobs=1)
    coords = mds.fit(delta).embedding_

    close, far = find_distance(coords[:samples, :], coords[samples+i, :])

    distance.append((close, far))

    axes[i].scatter(coords[:samples, 0], coords[:samples, 1], marker='x', c=colors[i], s=50, edgecolor='None')
    axes[i].scatter(coords[samples:, 0], coords[samples:, 1], marker='o', c=colors,    s=50, edgecolor='None')

    axes[i].scatter(coords[close, 0], coords[close, 1], marker='s', facecolor="none", c=colors[i], s=50, edgecolor='None')
    axes[i].scatter(coords[far, 0]  , coords[far, 1]  , marker='s', facecolor="none", c=colors[i], s=50, edgecolor='None')

    axes[i].set_title('Simulation '+str(i+1), fontsize=20)

markers = []
labels = [str(n+1) for n in range(simulations)]
for i in range(simulations):
     markers.append(Line2D([0], [0], linestyle='None', marker="o", markersize=10, markeredgecolor="none", markerfacecolor=colors[i]))
lgd = plt.legend(markers, labels, numpoints=1, bbox_to_anchor=(1.0, -0.055), ncol=simulations) 
plt.tight_layout()
plt.ylim(-1, 1)
plt.axis('equal')
plt.savefig('Simulations.pdf', bbox_extra_artists=(lgd,), format='pdf', bbox_inches='tight')

它的结果是:

enter image description here

可以看出,y轴限制从一个子图到另一个子图不同。 我想使用生成的最大/最小范围。

谢谢。

EDTI:MINIMAL EXAMPLE

%matplotlib inline

from sklearn.preprocessing import normalize
from sklearn import manifold
from matplotlib import pyplot as plt
from matplotlib.lines import Line2D

import numpy
import itertools

f, axes = plt.subplots(7, 1, sharex='col', sharey='row', figsize=(15, 30))
distance = []

for i in range(7):
    delta = numpy.random.randint(0, 100, (100, 100))

    axes[i].scatter(delta[:, 0], delta[:, 1], marker='x', c='r', s=50, edgecolor='None')

    axes[i].set_title('Simulation '+str(i+1), fontsize=20)
    axes[i].set_ylim(0, 100)

markers = []

plt.tight_layout()
plt.axis('equal')

enter image description here

2 个答案:

答案 0 :(得分:6)

你的第一行

f, axes = plt.subplots(7, 1, sharex='col', sharey='row', figsize=(15, 30))

sharey参数的值不合适。使用sharey='row'您要求每行中的所有子图共享相同的y轴,但每个子图本身都在一行中,因此您看不到共享。

如果您尝试sharey=Truesharey='col',您将获得所需内容。

附录

以下代码

In [34]: a = np.random.random(21)

In [35]: b = a+5

In [36]: x = np.arange(21)

In [37]: f, (ax, bx) = plt.subplots(2,1,sharey='row') # like yours

In [38]: ax.plot(x,a)
Out[38]: [<matplotlib.lines.Line2D at 0x7f5b98004f98>]

In [39]: bx.plot(x,b)
Out[39]: [<matplotlib.lines.Line2D at 0x7f5b980238d0>]

In [40]: f, (ax, bx) = plt.subplots(2,1,sharey='col') # like mine

In [41]: ax.plot(x,a)
Out[41]: [<matplotlib.lines.Line2D at 0x7f5b94764dd8>]

In [42]: bx.plot(x,b)
Out[42]: [<matplotlib.lines.Line2D at 0x7f5b98038198>]

In [43]: 

给我以下两个图。你能发现一个区别吗?

Using sharey='row'

Using sharey='col'

答案 1 :(得分:0)

您必须在制作绘图的主循环中添加线轴[i] .set_ylim(ymin,ymax)。例如,在以下行

下面
axes[i].set_title('Simulation '+str(i+1), fontsize=20)

添加:

axes[i].set_ylim(-1,1)

那应该解决它。

在您的示例中,您正在调用plt.ylim,但是从文档&#34;获取或设置当前轴的 y - 限制&#34;,在您的情况下对应到了最后的轴。

回答极简主义的例子:

从绘图中可以看出,除了最后一个轴外,所有轴都在y坐标中具有相同的限制。每次调用 plt。* 时,都会影响最后一个轴的行为。您对plt.axis的最后一次调用(&#39;等于&#39;)会影响最后一个情节。只需删除此行。