2015-04-08 186 views
2

我需要在兩個座標軸和右邊的一個顏色條上生成一個具有相同縱橫比的圖。我試過設置aspect='auto'aspect=1aspect='equal',但沒有好的結果。請參閱下面的示例和MWE。用顏色條設置等值線圖

使用aspect='auto'的colorbars是正確的高度,但該地塊被扭曲:

enter image description here

使用aspect=1aspect='equal'的曲線是正方形(在這兩個軸相等方面),但colorbars被扭曲:

enter image description here

在這兩個地塊colorbars太遠位於右側出於某種原因。如何獲得具有匹配高度的顏色條的方形圖?


MWE

import numpy as np 
import matplotlib.gridspec as gridspec 
import matplotlib.pyplot as plt 

def col_plot(params): 

    gs, i, data = params 

    xarr, yarr, zarr = zip(*data)[0], zip(*data)[1], zip(*data)[2] 

    xmin, xmax = min(xarr), max(xarr) 
    ymin, ymax = min(yarr), max(yarr) 

    #plt.subplot(gs[i], aspect='auto') 
    plt.subplot(gs[i], aspect=1) 
    #plt.subplot(gs[i], aspect='equal') 

    plt.xlim(xmin, xmax) 
    plt.ylim(xmin, xmax) 
    plt.xlabel('$x axis$', fontsize=20) 
    plt.ylabel('$y axis$', fontsize=20) 
    # Scatter plot. 
    cm = plt.cm.get_cmap('RdYlBu_r') 
    SC = plt.scatter(xarr, yarr, marker='o', c=zarr, s=60, lw=0.25, cmap=cm, 
     zorder=3) 
    # Colorbar. 
    ax0 = plt.subplot(gs[i + 1]) 
    cbar = plt.colorbar(SC, cax=ax0) 
    cbar.set_label('$col bar$', fontsize=21, labelpad=-2) 

# Generate data. 
data0 = np.random.uniform(0., 1., size=(50, 3)) 
data1 = np.random.uniform(0., 1., size=(50, 3)) 

# Create the top-level container 
fig = plt.figure(figsize=(14, 25)) 
gs = gridspec.GridSpec(4, 4, width_ratios=[1, 0.05, 1, 0.05]) 

# Generate plots. 
par_lst = [[gs, 0, data0], [gs, 2, data1]] 
for pl_params in par_lst: 
    col_plot(pl_params) 

# Output png file. 
fig.tight_layout() 
plt.savefig('colorbar_aspect.png', dpi=300) 

回答

4

您可以使用AxesDivider做到這一點。我已經修改了一下你的代碼來使用AxesDivider。

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

def col_plot(data): 

    xarr, yarr, zarr = zip(*data)[0], zip(*data)[1], zip(*data)[2] 
    xarr = [2*x for x in xarr] 

    xmin, xmax = min(xarr), max(xarr) 
    ymin, ymax = min(yarr), max(yarr) 

    fig = plt.figure() 

    ax0 = fig.add_subplot(111, aspect='equal') 

    plt.xlim(xmin, xmax) 
    plt.ylim(ymin, ymax) 
    plt.xlabel('$x axis$', fontsize=20) 
    plt.ylabel('$y axis$', fontsize=20) 
    # Scatter plot. 
    cm = plt.cm.get_cmap('RdYlBu_r') 
    SC = ax0.scatter(xarr, yarr, marker='o', c=zarr, s=60, lw=0.25, cmap=cm, 
     zorder=3) 

    the_divider = make_axes_locatable(ax0) 
    color_axis = the_divider.append_axes("right", size="5%", pad=0.1) 

    # Colorbar. 
    cbar = plt.colorbar(SC, cax=color_axis) 
    cbar.set_label('$col bar$', fontsize=21, labelpad=-2) 

# Generate data. 
data0 = np.random.uniform(0., 1., size=(20, 3)) 

col_plot(data0) 

這裏是結果(我改變了你的數據,以便跨越範圍[0,2]中用於演示目的的X方向):enter image description here

+0

感謝朱利安!我不得不修改你的答案,但使用'make_axes_locatable'是一個很好的解決方案。 – Gabriel

+0

不客氣:-) –