Пробвах и двете настройки дадени в другите коментари, а именно
cbar.solids.set_rasterized(True)
cbar.solids.set_edgecolor("face")
и за съжаление нито един от тях не ми подейства.
Така че опитах напълно различен подход, който е огромен хак, но поне свършва работата. Когато подадете alpha
към imshow
, това задава алфа стойност, която ще се използва за смесване с други изображения. Поради причини за по-висока мощност (както @mfra спомена) това създава белите линии, които толкова презираме. Очевидно ключът тогава е да не се предава алфа стойност на imshow
. Въпреки това все още трябва по някакъв начин да създадем цветната лента.
По този начин като заобиколно решение можем сами да направим алфа смесването, преди да дадем цветни карти на imshow
. Като пример, нека използваме цветовата карта winter
:
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')
Тук създавам нова цветова карта, my_cmap_rgb
, базирана на winter
и след това редактирам не-алфа каналите (0, 1 и 2), за да направя алфа смесването сам. След това мога просто да използвам тази нова цветова карта, за да начертая фигурата си.
f, ax = plt.subplots()
cim = ax.imshow(zz, cmap=my_cmap)
cbar = plt.colorbar(cim)
ax.set_title("No lines and no transparency")
Сега го сравнете с изображението, което бихте получили без този трик:
f, ax = plt.subplots()
cim = ax.imshow(zz, cmap='winter', alpha=0.5)
cbar = plt.colorbar(cim)
ax.set_title("Lines and transparency")
![„Линии](https://i.stack.imgur.com/Y3uAM.png)
Очевидно проблемът е решен, ако не се нуждаете от прозрачност. От друга страна, ако се нуждаете от прозрачност, има още едно решение. Първо трябва да начертаете изображение без прозрачност, за да получите цветната лента, и след това да начертаете изображение с прозрачност, но чиято цветна лента няма да бъде използвана.
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")
Това води до изображение, чиято цветна лента няма линии и въпреки това запазва прозрачността. Въпреки че остава огромен хак, поне вече не трябва да търпим тези редове!
![„Без](https://i.stack.imgur.com/w8ez3.png)
person
cako
schedule
27.02.2016