2017-09-20 8 views
0

Je voudrais définir la barre de couleurs de mon tracé à une hauteur personnalisée, pas nécessairement pour correspondre à la taille de l'intrigue. En fait, je voudrais que la hauteur de la barre de couleurs PLUS le titre en haut de celui-ci pour correspondre à la hauteur de la figure.Modifier la barre de couleurs matplotlib à la hauteur personnalisée

Avec

ax3 = divider.append_axes('right', size='10%', pad=0.3) 
cb = plt.colorbar(Q, cax=ax3, ticks=[0.0, 3.0, 6.0, 9.0, 12.0, 15.0], format='%.1f') 

je réussi à avoir un colorbar avec la même hauteur que l'intrigue, qui a été demandé pour beaucoup d'autres fois, maintenant je voudrais rétrécir.

Suite à la suggestion fournie dans d'autres questions, j'ai décidé de donner explicitement à la barre de couleurs ses propres axes avec add_axes, après avoir obtenu la position des derniers axes de traçage avec get_position. Voici ce que j'essaie de faire. Il n'y a pas de données et pas colorbar dans cet exemple, juste pour montrer que je ne reçois pas le résultat que je m'y attendais:

from __future__ import unicode_literals 
    import numpy as np 
    from scipy.interpolate import griddata 
    import matplotlib 
    import matplotlib.pyplot as plt 
    from matplotlib.patches import Circle 
    from matplotlib.pylab import cm 
    import matplotlib.colors as colors 
    from mpl_toolkits.axes_grid1 import make_axes_locatable, axes_size 

    matplotlib.rcParams.update({'font.size': 8}) 

    fig = plt.figure() 
    fig.set_size_inches(6.3,6.3) 

    ax1 = plt.subplot(111) 
    divider = make_axes_locatable(ax1) 
    ax2 = divider.append_axes('right', size='100%', pad=0.3) 

    axes = [ax1, ax2] 
    ltypes = ['dashed', 'solid'] 

    xi = np.linspace(-18.125, 18.125, 11) 
    yi = np.linspace(0, 28, 9) 
    xv, yv = np.meshgrid(xi, yi) 

    xcOdd = 0.2 
    zcOdd = 0.725 
    xcEven = 0.6 
    zcEven = 0.725 

    maskRadius = 0.15 

    for i in range(2): 
     ax = axes[i] 
     ax.set_xlabel('distance [m]') 
     if i == 0: 
      ax.set_ylabel('depth [m]') 
     if i == 1: 
      ax.set_yticklabels([]) 
     ax.invert_yaxis() 
     ax.tick_params(direction='in') 
     ax.set_aspect('equal') 
     odd = Circle((xcOdd, zcOdd), .15, linewidth=1.2, color='k', fill=False) 
     even = Circle((xcEven, zcEven), .15, linewidth=1.2, linestyle=ltypes[i], color='k', fill=False) 

     vmax = 15. 
     vmin = 0. 
     norm = matplotlib.colors.Normalize(vmin,vmax, clip=False) 

     color_map = matplotlib.colors.ListedColormap(plt.cm.Greys(np.linspace(0.25, 1, 5)), "name") 

     ax.add_patch(odd) 
     pad = 0.03 
     width = 0.03 

     pos = ax2.get_position() 

     ax3 = fig.add_axes([pos.xmax + pad, pos.ymin, width, 0.7*(pos.ymax-pos.ymin) ]) 

     plt.savefig('prova-vect-paper-test-2.eps', format='eps') 

Pourquoi get_position renvoyait les mauvaises BoîteDeContour?

+0

Pourquoi ne puis-je voir commenta et des réponses à cette question plus ?? – user2078621

+0

L'utilisateur qui a fourni une réponse l'a supprimé car il n'a apparemment pas résolu votre problème. En ce qui concerne le problème réel, vous voudrez probablement aller plus en détail sur la façon dont votre intrigue devrait ressembler. (Cela dépend aussi du type de personnage que vous montrez, est-ce un format égal ou non?). – ImportanceOfBeingErnest

Répondre

1

Vous devez dessiner la toile avant d'obtenir la position réelle de .get_position(). En effet, en raison du rapport d'aspect égal, les axes changent de taille et de position au moment du tirage.

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

matplotlib.rcParams.update({'font.size': 8}) 

fig = plt.figure() 
fig.set_size_inches(6.3,6.3) 

ax1 = plt.subplot(111) 
divider = make_axes_locatable(ax1) 
ax2 = divider.append_axes('right', size='100%', pad=0.3) 

axes = [ax1, ax2] 


xi = np.linspace(-18.125, 18.125, 11) 
yi = np.linspace(0, 28, 9) 
xv, yv = np.meshgrid(xi, yi) 


for i in range(2): 
    ax = axes[i] 
    ax.set_xlabel('distance [m]') 
    if i == 0: 
     ax.set_ylabel('depth [m]') 
    if i == 1: 
     ax.set_yticklabels([]) 
    ax.invert_yaxis() 
    ax.tick_params(direction='in') 
    ax.set_aspect('equal') 
    vmax = 15. 
    vmin = 0. 
    norm = colors.Normalize(vmin,vmax, clip=False) 

    color_map = colors.ListedColormap(plt.cm.Greys(np.linspace(0.25, 1, 5)), "name") 

    im = ax.imshow(yv, cmap=color_map, norm=norm) 

pad = 0.03 
width = 0.03 

fig.canvas.draw() 
pos = ax2.get_position() 

ax3 = fig.add_axes([pos.xmax + pad, pos.ymin, width, 0.7*(pos.ymax-pos.ymin) ]) 
fig.colorbar(im, cax=ax3) 

plt.show() 

enter image description here

+0

J'ai coupé et collé votre code, et voici ce que j'ai: [link] (https://pasteboard.co/GLg3sw3.png) Comment peut-il être complètement différent du vôtre? – user2078621

+0

Je n'en ai aucune idée. Travaillez-vous sur un mac? – ImportanceOfBeingErnest

+0

oui j'utilise un mac – user2078621