2013-02-21 25 views
33

Chỉnh sửa: Vì đây có vẻ là một bài đăng phổ biến, đây là giải pháp dường như hoạt động tốt cho tôi. Cảm ơn @gazzar và @mfra.Tại sao thanh màu của tôi có đường kẻ trong đó?

cbar.solids.set_rasterized(True) 
cbar.solids.set_edgecolor("face") 

Có ai biết tại sao colorbar của tôi có những gì xuất hiện được dòng trong nó? Hay đúng hơn là tại sao chuyển tiếp màu không mượt mà? Tôi đang sử dụng bản đồ cơ sở, rõ ràng, nhưng đó không phải là vấn đề vì đó là tất cả các cuộc gọi matplotlib dưới AFAICT mui xe. Tôi tạo bản đồ làm một cái gì đó như

grays = plt.cm.get_cmap("Grays") 
sc = mymap.scatter(xpoints, ypoints, s=sizes, c=color_values, cmap=grays, alpha=.75, 
        marker="o", zorder=10, vmin=0, vmax=1) 
cbar = mymap.colorbar(sc, drawedges=True, location="bottom") 

Tôi đã thử không có và không có alpha và kết quả là như nhau. Có lẽ đó là vì mảng color_values ​​của tôi không đủ tốt? Tôi có thể đặt các giá trị cơ bản được ánh xạ tới thanh màu ở đâu đó không? Tôi không thấy làm thế nào, và tôi không thấy vấn đề này ở nơi khác. Tức là, tôi có thể tái tạo ví dụ matplotlib show_colorbars mà không có vấn đề này.

Bad Colorbar Example

+1

Bạn đã cố lưu hình bằng các định dạng khác nhau chưa? Nếu có, bạn có luôn gặp vấn đề này không? –

+0

Tôi chỉ thấy điều này là kết quả của alpha, bạn có thực sự chắc chắn nó giống với alpha = 1.0 không? –

+0

Có, nó xảy ra với png, nhưng tôi đã không khắc phục sự cố này. Có, tôi đã thấy nó cho alpha = 1.0 với SVG. – jseabold

Trả lời

25

Trong trường hợp bạn tạo đồ họa vector, bạn đã thử này (lấy từ http://matplotlib.org/api/pyplot_api.html?highlight=colorbar#matplotlib.pyplot.colorbar):.

"Được biết, một số người xem đồ họa vector (svg và pdf) làm cho khoảng trống trắng giữa các phân đoạn của colorbar Đây là do lỗi trong khán giả không matplotlib là một workaround các colorbar có thể được trả lại với phân đoạn chồng chéo:.

cbar = colorbar() 
cbar.solids.set_edgecolor("face") 
draw() 

Tuy nhiên điều này có hậu quả tiêu cực trong những hoàn cảnh khác Riêng với hình ảnh bán trong suốt (alpha < 1) và phần mở rộng colorbar. và không được kích hoạt theo mặc định, xem (issue # 1188). "

+0

Cảm ơn. Điều này thực sự dường như là vấn đề đọc qua # 1188 và PR (được hoàn nguyên) đính kèm. Điều thú vị là tốt, SVG làm khác nhau trong Firefox và Chrome, mà tôi đã không nghĩ đến. – jseabold

+0

Có vẻ như kết quả tốt nhất cho alpha <1 đến từ việc sử dụng drawedges = False và set_edgecolor ("face"). Hiện tại tôi có các đường màu đen, nhưng chúng ít rõ rệt hơn và chỉ có màu tối hơn. – jseabold

+0

Nó thực sự là một lỗi trong trình xem (s), nhưng nó cũng đúng là một cách tối ưu được sử dụng để render colorbar. Toàn bộ hình nên được vẽ như một mảnh duy nhất sử dụng bóng mượt mà hơn 256 hình chữ nhật nhỏ. Cả định dạng PDF và SVG đều hỗ trợ tô bóng mượt mà với màu sắc tùy ý. – Mojca

1

Hãy thử:

cbar = mymap.colorbar(sc, drawedges=False, location="bottom") 

Nó bây giờ cũng là tài liệu trên web (mà tôi có thể tìm thấy), nhưng

*drawedges* [ False | True ] If true, draw lines at color 
       boundaries. 

(kéo từ matplotlib/lib/matplotlib/colorbar.py) Tôi nghĩ rằng bằng cách thiết lập drawedges đến True bạn đang yêu cầu nó vẽ các đường đó.

+0

drawedges thực sự vẽ các cạnh cho tôi, nhưng vẽ chúng bằng màu đen! Không đặc biệt hữu ích. mfra của giải pháp hoạt động mà không có drawedges cho tôi. (matplotlib v1.3.1) – travc

5

Dường như cốt truyện của bạn sử dụng một số giá trị trong suốt (alpha). Tôi đã gặp vấn đề tương tự (âm mưu bán trong suốt, nhưng muốn thanh màu sắc chắc chắn), và điều này questionanswer sửa nó cho tôi! Để tham khảo:

cbar.set_alpha(1) 
cbar.draw_all() 
8

Tôi thường thích dùng effect nội dung colorbar để tránh vấn đề này bằng những lời khuyên Eric Firing của here bằng cách thêm dòng sau.

cbar.solids.set_rasterized(True) 

Cách giải quyết này được cho là không thành công cho hình ảnh trong suốt, nhưng đối với hầu hết các trường hợp thông thường, nó tạo ra kết quả mong muốn.

+1

Vòng quanh hai năm sau đó. Điều này thực sự giúp khá nhiều. – jseabold

+1

Tuyệt vời. Có vẻ tốt hơn, và sản lượng svg nhỏ hơn là tốt! – Bram

4

tôi đã cố gắng cả các thiết lập được trên các ý kiến ​​khác, cụ thể là

cbar.solids.set_rasterized(True) 
cbar.solids.set_edgecolor("face") 

và tiếc là không làm việc cho tôi.

Vì vậy, tôi đã thử một cách tiếp cận hoàn toàn khác, đó là một hack lớn, nhưng ít nhất là hoàn thành công việc. Khi bạn vượt qua alpha đến imshow, nó sẽ đặt giá trị alpha sẽ được sử dụng để kết hợp với các hình ảnh khác. Do các lý do về quyền lực cao hơn (như @mfra đã đề cập), điều này tạo ra các đường màu trắng mà chúng ta coi thường. Rõ ràng, chìa khóa là để không chuyển giá trị alpha đến imshow. Tuy nhiên, chúng tôi vẫn cần bằng cách nào đó tạo ra thanh màu.

Do đó, cách giải quyết khác là chúng tôi có thể tự pha trộn alpha trước khi đưa colormaps vào imshow. Như một ví dụ, chúng ta hãy sử dụng winter colormap:

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

xx, yy = np.meshgrid(np.linspace(-1, 1, 100), np.linspace(-1, 1, 100)) 
zz = xx**2 + yy**2 

my_cmap_rgb = plt.get_cmap('winter')(np.arange(256)) 
alpha = 0.5 

for i in range(3): # Do not include the last column! 
    my_cmap_rgb[:,i] = (1 - alpha) + alpha*my_cmap_rgb[:,i] 
my_cmap = mpl.colors.ListedColormap(my_cmap_rgb, name='my_cmap') 

Ở đây tôi tạo ra một bản đồ màu mới, my_cmap_rgb, dựa trên winter và sau đó chỉnh sửa các kênh phi-alpha (0, 1 và 2) để làm alpha pha trộn bản thân mình . Sau đó tôi có thể sử dụng bản đồ màu mới này để vẽ hình của tôi.

f, ax = plt.subplots() 
cim = ax.imshow(zz, cmap=my_cmap) 
cbar = plt.colorbar(cim) 
ax.set_title("No lines and no transparency") 

No lines and no transparency Bây giờ so sánh nó với hình ảnh mà bạn muốn có được mà không cần thủ thuật này:

f, ax = plt.subplots() 
cim = ax.imshow(zz, cmap='winter', alpha=0.5) 
cbar = plt.colorbar(cim) 
ax.set_title("Lines and transparency") 

Lines and transparency

Rõ ràng vấn đề được giải quyết nếu bạn không cần minh bạch. Mặt khác, nếu bạn yêu cầu minh bạch, có một cách giải quyết khác. Trước tiên, bạn phải vẽ một hình ảnh mà không có độ trong suốt để có được thanh màu sắc, và sau đó vẽ một ô với độ trong suốt, nhưng thanh màu sẽ không được sử dụng.

f, ax = plt.subplots() 
cim = ax.imshow(zz, cmap=my_cmap) 
cbar = plt.colorbar(cim) 
plt.cla() # Clears axis 
ax.plot(50,50, 'ko') 
ax.imshow(zz, cmap='winter', alpha=0.5) 
ax.set_title("No lines and transparency") 

Điều này dẫn đến hình ảnh có vạch màu không có đường nhưng vẫn giữ được độ trong suốt. Trong khi nó vẫn là một hack lớn, ít nhất chúng tôi không phải đưa lên với những dòng này nữa!

No lines and transparency

+0

Tôi đã áp dụng thủ thuật cuối cùng (cốt truyện không có alpha, âm mưu màu, âm mưu có alpha), vì tôi phải có hình ảnh để chạy qua imshow, với hình ảnh thứ hai được phủ trong suốt đầu tiên và thanh thứ hai có thanh màu. Vì vậy, chạy vào vấn đề transparenty - sọc. – Evert

0

Sau đây có thể là một giải pháp ngay cả khi nó không phải là thanh lịch.

In [1]: children = cbar.ax.get_children() 
In [2]: children 
Out[2]: 
[<matplotlib.collections.QuadMesh at 0x21783c41b70>, 
<matplotlib.collections.LineCollection at 0x21783bfdc18>, 
<matplotlib.patches.Polygon at 0x21783ba0588>, 
<matplotlib.patches.Polygon at 0x21783beef98>, 
<matplotlib.spines.Spine at 0x21783b77c88>, 
<matplotlib.spines.Spine at 0x21783b77470>, 
<matplotlib.spines.Spine at 0x21783b70c88>, 
<matplotlib.spines.Spine at 0x21783b70860>, 
<matplotlib.axis.XAxis at 0x21783b6ac50>, 
<matplotlib.axis.YAxis at 0x21783ba60f0>, 
<matplotlib.text.Text at 0x21783bc2198>, 
<matplotlib.text.Text at 0x21783bc2320>, 
<matplotlib.text.Text at 0x21783bc22b0>, 
<matplotlib.patches.Rectangle at 0x21783bc2358>] 
In [3]: obj = children[1] # Get the LineCollection object 
In [4]: obj.set_linewidth(0) 
0

Kể từ khi không ai trong số những gợi ý khác làm việc cho tôi, tôi đã kết thúc loại bỏ các kênh alpha từ dụ colorbar:

from matplotlib.colors import to_rgb 

lut = colorbar.solids.get_facecolor() 
bg_color = to_rgb('white') 
lut[:, :3] *= lut[:, 3:] 
lut[:, :3] += (1 - lut[:, 3:]) * bg_color 
lut[:, 3] = 1. 
colorbar.solids.set_facecolor(lut) 

Các colorbar phải được rút ra một lần trước khi có thể truy cập vào các màu sắc khuôn mặt .

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