2013-05-16 32 views
11

Tôi đang hiển thị một số đồ họa trong python với matplotlib, và sẽ đưa chúng vào giấy LaTeX (sử dụng liên kết bảng đẹp của LaTex thay vì fiddling với matplotlib's ImageGrid, v.v.). Tôi muốn tạo và lưu một thanh màu độc lập với savefig mà không cần sử dụng imshow.Thanh màu độc lập (matplotlib)

(các vlim, vmax thông số, cũng như cmap có thể được cung cấp một cách rõ ràng)

Cách duy nhất tôi có thể tìm được khá phức tạp và (từ những gì tôi hiểu) vẽ một hình chữ nhật mã hóa cứng vào bức tranh: http://matplotlib.org/examples/api/colorbar_only.html

Có cách nào thanh lịch để tạo thanh màu độc lập với matplotlib không?

+5

Thành thực mà nói giống như họ đã làm hầu hết công việc cho bạn .. Tôi không biết nếu bạn sẽ tìm thấy bất cứ điều gì tốt hơn so với có thể tiết kiệm, xác định colormap của bạn, phạm vi, vv tất cả cùng một lúc. – mdscruggs

+0

Tôi sẽ chỉ ra rằng những gì bạn nói có vẻ phức tạp trong những gì 'plt.colorbar' không cho bạn đằng sau hậu trường. – tacaswell

+0

@tcaswell Tôi đồng ý, tất nhiên. Tôi đã chỉ tự hỏi nếu có một giải pháp thanh lịch hơn mà không yêu cầu reimplementing 'plt.colorbar'; các giải pháp liên kết là tốt để cắt và dán vào, nhưng cảm thấy không phù hợp so với gọi 'plt.colorbar()' sau 'plt.imshow' với một ma trận trống (lưu ý cho hậu thế: mà không hoạt động). – user

Trả lời

16

Bạn có thể tạo một số hình ảnh giả và sau đó ẩn rìu của nó. Vẽ thanh màu của bạn trong một trục tùy chỉnh.

import pylab as pl 
import numpy as np 

a = np.array([[0,1]]) 
pl.figure(figsize=(9, 1.5)) 
img = pl.imshow(a, cmap="Blues") 
pl.gca().set_visible(False) 
cax = pl.axes([0.1, 0.2, 0.8, 0.6]) 
pl.colorbar(orientation="h", cax=cax) 
pl.savefig("colorbar.pdf") 

kết quả:

enter image description here

+0

Đó là những gì tôi đang nói về! – user

+5

Nó ném một AssertionError '' assert position == 'top' hoặc position == 'bottom''' cho tôi. Thay đổi mã thành '' pl.colorbar (orientation = 'horizontal', cax = cax) '' cố định vấn đề và tạo ra kết quả mà tôi đang tìm kiếm. Có thể là một số vấn đề về phiên bản. – Nras

2

Sử dụng ý tưởng giống như trong câu trả lời HYRY, nếu bạn muốn có một "độc lập" colorbar theo nghĩa là nó không phụ thuộc vào các mục trên một nhân vật (không được kết nối trực tiếp với cách chúng được tô màu), bạn có thể thực hiện một số việc như sau:

from matplotlib import pyplot as plt 
import numpy as np 

# create dummy invisible image 
# (use the colormap you want to have on the colorbar) 
img = plt.imshow(np.array([[0,1]]), cmap="Oranges") 
img.set_visible(False) 

plt.colorbar(orientation="vertical") 

# add any other things you want to the figure. 
plt.plot(np.random.rand(30)) 
+0

Giải pháp rất đẹp! –

0

Vì vậy, dựa trên this answer here, nếu bạn muốn tôi và muốn tránh xấu xí plt.imshow giả này(), bạn có thể làm điều này trong về cơ bản hai dòng:

import matplotlib as mpl 
import matplotlib.pyplot as plt 


fig, ax = plt.subplots() 
col_map = plt.get_cmap('nipy_spectral') 
mpl.colorbar.ColorbarBase(ax, cmap=col_map, orientation = 'vertical') 

# As for a more fancy example, you can also give an axes by hand: 
c_map_ax = fig.add_axes([0.2, 0.8, 0.6, 0.02]) 
c_map_ax.axes.get_xaxis().set_visible(False) 
c_map_ax.axes.get_yaxis().set_visible(False) 

# and create another colorbar with: 
mpl.colorbar.ColorbarBase(c_map_ax, cmap=col_map, orientation = 'horizontal') 

picture of resulting figure

Các vấn đề liên quan