Tôi không thể có được thanh màu trên các biểu đồ imshow như biểu đồ này có cùng chiều cao với biểu đồ, không sử dụng Photoshop sau khi thực tế. Làm thế nào để tôi có được chiều cao phù hợp?
fraction
hoặc lập luận shrink
.
Tôi không thể có được thanh màu trên các biểu đồ imshow như biểu đồ này có cùng chiều cao với biểu đồ, không sử dụng Photoshop sau khi thực tế. Làm thế nào để tôi có được chiều cao phù hợp?
fraction
hoặc lập luận shrink
.
Câu trả lời:
Bạn có thể thực hiện việc này một cách dễ dàng với công cụ trục chính matplotlib .
Ví dụ từ trang được liên kết cũng hoạt động mà không sử dụng các ô con:
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
, nó sẽ được hiển thị ở bên phải. Có cách nào để khắc phục điều này?
Sự kết hợp này (và các giá trị gần với chúng) dường như "kỳ diệu" đối với tôi để giữ cho thanh màu được chia tỷ lệ theo cốt truyện, bất kể kích thước màn hình hiển thị.
plt.colorbar(im,fraction=0.046, pad=0.04)
Nó cũng không yêu cầu chia sẻ trục có thể đưa cốt truyện ra khỏi hình vuông.
im_ratio = data.shape[0]/data.shape[1]
plt.colorbar(im,fraction=0.046*im_ratio, pad=0.04)
ở đâu data
.
@bogatron đã đưa ra câu trả lời được đề xuất bởi các tài liệu matplotlib , tạo ra chiều cao phù hợp, nhưng nó đưa ra một vấn đề khác. Bây giờ chiều rộng của thanh màu (cũng như khoảng cách giữa thanh màu và ô) thay đổi theo chiều rộng của ô. Nói cách khác, tỷ lệ khung hình của thanh màu không còn cố định nữa.
Để có được cả chiều cao phù hợp và tỷ lệ khung hình nhất định, bạn phải đào sâu hơn một chút vào axes_grid1
mô-đun bí ẩn .
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)
Lưu ý rằng điều này chỉ định chiều rộng của thanh màu ghi chiều cao của ô (trái ngược với chiều rộng của hình, như trước đây).
Khoảng cách giữa thanh màu và ô bây giờ có thể được chỉ định là một phần nhỏ của chiều rộng của thanh màu, đó là IMHO một số có ý nghĩa hơn nhiều so với một phần của chiều rộng hình.
CẬP NHẬT:
Tôi đã tạo một sổ ghi chép IPython về chủ đề này , nơi tôi đã đóng gói mã ở trên vào một chức năng có thể sử dụng lại dễ dàng:
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)
Nó có thể được sử dụng như thế này:
im = plt.imshow(np.arange(200).reshape((20, 10)))
add_colorbar(im)
Tôi đánh giá cao tất cả các câu trả lời ở trên. Tuy nhiên, giống như một số câu trả lời và ý kiến chỉ ra, các axes_grid1
mô-đun có thể không GeoAxes địa chỉ, trong khi điều chỉnh fraction
, pad
, shrink
, và các thông số tương tự khác có thể không nhất thiết phải đưa ra thứ tự rất chính xác, mà thực sự làm tôi bực mình. Tôi tin rằng việc đưa ra chính colorbar
nó axes
có thể là một giải pháp tốt hơn để giải quyết tất cả các vấn đề đã được đề cập.
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)
Sau này, tôi thấy matplotlib.pyplot.colorbar
tài liệu chính thức cũng cung cấp ax
tùy chọn, đó là các trục hiện có sẽ cung cấp chỗ cho thanh màu. Do đó, nó rất hữu ích cho nhiều subplots, xem sau.
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)
Một lần nữa, bạn cũng có thể đạt được các hiệu ứng tương tự bằng cách chỉ định cax, một cách chính xác hơn từ quan điểm của tôi.
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)
Khi bạn tạo colorbar
thử, sử dụng tham số phân số và / hoặc thu nhỏ.
Từ các tài liệu:
phần 0,15; một phần của các trục ban đầu được sử dụng cho colorbar
co lại 1,0; phân số để thu nhỏ thanh màu
colorbar()
hàm hoặc phương thức.
Tất cả các giải pháp trên đều tốt, nhưng tôi thích cách tốt nhất của @ Steve và @ bejota vì chúng không liên quan đến các cuộc gọi ưa thích và mang tính phổ quát.
Theo phổ quát tôi có nghĩa là làm việc với bất kỳ loại trục bao gồm GeoAxes
. Ví dụ: bạn đã chiếu các trục để ánh xạ:
projection = cartopy.crs.UTM(zone='17N')
ax = plt.axes(projection=projection)
im = ax.imshow(np.arange(200).reshape((20, 10)))
một cuộc gọi đến
cax = divider.append_axes("right", size=width, pad=pad)
sẽ thất bại với: KeyException: map_projection
Do đó, cách phổ biến duy nhất để xử lý kích thước thanh màu với tất cả các loại trục là:
ax.colorbar(im, fraction=0.046, pad=0.04)
Làm việc với phân số từ 0,035 đến 0,046 để có kích thước tốt nhất của bạn. Tuy nhiên, các giá trị cho phân số và paddig sẽ cần được điều chỉnh để phù hợp nhất với cốt truyện của bạn và sẽ khác nhau tùy theo hướng của thanh màu nằm ở vị trí thẳng đứng hay nằm ngang.
shrink
tham số khi fraction
cùng với pad
không tạo ra kết quả mong muốn đủ.