Bunun gibi imshow grafiklerinde colorbar'ı grafikle aynı yükseklikte alamıyorum, gerçeğin ardından Photoshop'u kullanmıyorum. Yükseklikleri nasıl eşleştirebilirim?
Bunun gibi imshow grafiklerinde colorbar'ı grafikle aynı yükseklikte alamıyorum, gerçeğin ardından Photoshop'u kullanmıyorum. Yükseklikleri nasıl eşleştirebilirim?
Yanıtlar:
Bunu bir matplotlib AxisDivider ile kolayca yapabilirsiniz .
Bağlantılı sayfadaki örnek alt grafikler kullanmadan da çalışır:
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import numpy as np
plt.figure()
ax = plt.gca()
im = ax.imshow(np.arange(100).reshape((10,10)))
# create an axes on the right side of ax. The width of cax will be 5%
# of ax and the padding between cax and ax will be fixed at 0.05 inch.
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)
plt.colorbar(im, cax=cax)
plt.title
Düğmesini kullanarak bir başlık eklemek isterseniz, başlık sağa takas olarak görüntülenir. Bunun üstesinden gelmenin bir yolu var mı?
Bu kombinasyon (ve bunlara yakın değerler), ekranın boyutu ne olursa olsun, renk çubuğunu çizimde ölçeklendirmek için "sihirli bir şekilde" işe yarıyor gibi görünüyor.
plt.colorbar(im,fraction=0.046, pad=0.04)
Ayrıca, arsa kareden çıkarabilecek eksenin paylaşılmasını gerektirmez.
im_ratio = data.shape[0]/data.shape[1]
plt.colorbar(im,fraction=0.046*im_ratio, pad=0.04)
nerede data
.
@bogatron , doğru yüksekliği üreten matplotlib dokümanlarının önerdiği cevabı zaten verdi , ancak farklı bir sorun getiriyor. Şimdi renk çubuğunun genişliği (ve ayrıca renk çubuğu ve grafik arasındaki boşluk) grafiğin genişliği ile değişir. Başka bir deyişle, renk çubuğunun en boy oranı artık sabit değildir.
Doğru yüksekliği hem almak için ve belirli bir boy oranı, gizemli derinliklerine biraz kazmak zorunda axes_grid1
modülü.
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable, axes_size
import numpy as np
aspect = 20
pad_fraction = 0.5
ax = plt.gca()
im = ax.imshow(np.arange(200).reshape((20, 10)))
divider = make_axes_locatable(ax)
width = axes_size.AxesY(ax, aspect=1./aspect)
pad = axes_size.Fraction(pad_fraction, width)
cax = divider.append_axes("right", size=width, pad=pad)
plt.colorbar(im, cax=cax)
Bunun çizimin yüksekliği için renk çubuğunun genişliğini belirlediğine dikkat edin ( şeklin genişliğinin aksine , eskisi gibi).
Renk çubuğu ve çizim arasındaki boşluk, artık renk çubuğunun genişliğinin bir kısmı olarak belirtilebilir, bu IMHO, şekil genişliğinin bir kısmından çok daha anlamlı bir sayıdır.
GÜNCELLEME:
Ben yukarıdaki kodu kolayca yeniden kullanılabilir bir fonksiyon içine paketlenmiş konu üzerinde bir IPython defter oluşturdum :
import matplotlib.pyplot as plt
from mpl_toolkits import axes_grid1
def add_colorbar(im, aspect=20, pad_fraction=0.5, **kwargs):
"""Add a vertical color bar to an image plot."""
divider = axes_grid1.make_axes_locatable(im.axes)
width = axes_grid1.axes_size.AxesY(im.axes, aspect=1./aspect)
pad = axes_grid1.axes_size.Fraction(pad_fraction, width)
current_ax = plt.gca()
cax = divider.append_axes("right", size=width, pad=pad)
plt.sca(current_ax)
return im.axes.figure.colorbar(im, cax=cax, **kwargs)
Bu şekilde kullanılabilir:
im = plt.imshow(np.arange(200).reshape((20, 10)))
add_colorbar(im)
Yukarıdaki tüm cevapları takdir ediyorum. Bazı cevaplar ve yorumlar işaret gibi Ancak, axes_grid1
modül adres GeoAxes, ayarlama oysa edemez fraction
, pad
, shrink
ve diğer benzer parametreler mutlaka beni gerçekten rahatsız çok hassas düzeni, veremez. colorbar
Kendi başına vermenin, axes
bahsi geçen tüm konuları ele almak için daha iyi bir çözüm olabileceğine inanıyorum .
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure()
ax = plt.axes()
im = ax.imshow(np.arange(100).reshape((10,10)))
# Create an axes for colorbar. The position of the axes is calculated based on the position of ax.
# You can change 0.01 to adjust the distance between the main image and the colorbar.
# You can change 0.02 to adjust the width of the colorbar.
# This practice is universal for both subplots and GeoAxes.
cax = fig.add_axes([ax.get_position().x1+0.01,ax.get_position().y0,0.02,ax.get_position().height])
plt.colorbar(im, cax=cax) # Similar to fig.colorbar(im, cax = cax)
Daha sonra, matplotlib.pyplot.colorbar
resmi belgelerin de ax
renk çubuğuna yer açacak mevcut eksenler olan seçenek sunduğunu görüyorum. Bu nedenle, birden fazla alt grafik için yararlıdır, aşağıdakilere bakın.
fig, ax = plt.subplots(2,1,figsize=(12,8)) # Caution, figsize will also influence positions.
im1 = ax[0].imshow(np.arange(100).reshape((10,10)), vmin = -100, vmax =100)
im2 = ax[1].imshow(np.arange(-100,0).reshape((10,10)), vmin = -100, vmax =100)
fig.colorbar(im1, ax=ax)
Yine, bakış açımdan daha doğru bir yol olan cax belirterek de benzer efektler elde edebilirsiniz.
fig, ax = plt.subplots(2,1,figsize=(12,8))
im1 = ax[0].imshow(np.arange(100).reshape((10,10)), vmin = -100, vmax =100)
im2 = ax[1].imshow(np.arange(-100,0).reshape((10,10)), vmin = -100, vmax =100)
cax = fig.add_axes([ax[1].get_position().x1-0.25,ax[1].get_position().y0,0.02,ax[0].get_position().y1-ax[1].get_position().y0])
fig.colorbar(im1, cax=cax)
Oluşturduğunuzda colorbar
kesir ve / veya daraltma parametrelerini deneyin.
Belgelerden:
fraksiyon 0.15; colorbar için kullanılacak orijinal eksenlerin oranı
küçültmek 1.0; renk çubuğunu küçültecek kesir
colorbar()
işleve veya yönteme ilişkin parametreler olması gerekir .
Yukarıdaki tüm çözümler iyi, ancak fantezi çağrıları içermediği ve evrensel oldukları için @ Steve'in ve @ bejota'nın en iyisini seviyorum.
Evrensel derken, bunun da dahil olmak üzere her türlü eksenle çalıştığını kastediyorum GeoAxes
. Örneğin, eşleme için eksenleri yansıttınız:
projection = cartopy.crs.UTM(zone='17N')
ax = plt.axes(projection=projection)
im = ax.imshow(np.arange(200).reshape((20, 10)))
çağrı
cax = divider.append_axes("right", size=width, pad=pad)
ile başarısız olacak: KeyException: map_projection
Bu nedenle, tüm eksen türleri ile renk çubuğu boyutunu ele almanın tek evrensel yolu:
ax.colorbar(im, fraction=0.046, pad=0.04)
En iyi boyutunuzu elde etmek için 0,035'ten 0,046'ya kadar kesirle çalışın. Bununla birlikte, kesir ve paddig değerlerinin çiziminiz için en iyi uyumu sağlayacak şekilde ayarlanması gerekir ve renk çubuğunun yönü dikey konumda mı yoksa yatay mı olduğuna göre değişir.
shrink
zaman parametresi fraction
ile birlikte pad
yeterince istenilen sonuçları yoktur.