50

編集:これは人気のある投稿のように思われるので、私にとってうまく機能していると思われる解決策を次に示します。@gazzar と @mfra に感謝します。

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

カラーバーに線のように見える理由を知っている人はいますか? というか、色の移り変わりが滑らかでないのはなぜですか?私は明らかにベースマップを使用していますが、AFAICT の内部でのすべての matplotlib 呼び出しであるため、それは問題ではありません。次のようなマップを作成します

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")

アルファなしとアルファなしで試しましたが、結果は同じでした。たぶん、私の color_values 配列が十分でないからでしょうか? カラーバーにマップされている基になる値をどこかに設定できますか? 方法がわかりません。また、この問題は他の場所では見られません。つまり、この問題なしで matplotlib show_colorbars の例を複製できます。

悪いカラーバーの例

4

7 に答える 7

31

ベクター グラフィックスを作成する場合は、これを試しましたか ( http://matplotlib.org/api/pyplot_api.html?highlight=colorbar#matplotlib.pyplot.colorbarから取得):

「一部のベクター グラフィックス ビューアー (svg および pdf) では、カラーバーのセグメント間に白いギャップがレンダリングされることが知られています。これは、matplotlib ではなくビューアーのバグによるものです。回避策として、カラーバーをオーバーラップ セグメントでレンダリングできます。

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

ただし、これは他の状況ではマイナスの結果をもたらします。特に、半透明の画像 (アルファ < 1) とカラーバー拡張機能はデフォルトでは有効になっていません (issue #1188) を参照してください。"

于 2013-02-22T10:06:01.450 に答える
11

プロットで透明な (アルファ) 値が使用されているようです。私はこれと同じ問題を抱えていました(半透明のプロットですが、カラーバーを塗りつぶしたかったのです)、この質問回答で解決しました!参考のため:

cbar.set_alpha(1)
cbar.draw_all()
于 2013-03-26T03:10:24.307 に答える
10

他のコメントに記載されている両方の設定を試しました。

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

残念ながら、どちらも私にとってはうまくいきませんでした。

だから私は巨大なハックである完全に異なるアプローチを試みましたが、少なくとも仕事を成し遂げました. 渡すalphaimshow、他の画像とのブレンドに使用されるアルファ値が設定されます。より高いパワーの理由により(@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) を編集して自分でアルファ ブレンディングを行います。次に、この新しいカラーマップを使用して Figure をプロットするだけです。

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")

線と透明度

透明性を必要としない場合、明らかに問題は解決されます。一方、透明性が必要な場合は、もう 1 つの回避策があります。カラーバーを取得するには、最初に透明度のない画像をプロットし、次に透明度のある画像をプロットする必要がありますが、そのカラーバーは使用されません。

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")

これにより、カラーバーに線がなくても透明度が保持されている画像が得られます。依然として大規模なハッキングですが、少なくともこれらの行に我慢する必要はありません!

線と透明度なし

于 2016-02-27T16:25:42.683 に答える
1

試す:

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

現在、ウェブ上で十分に文書化されています(私が見つけることができました)が、

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

(から引っ張ってきましたmatplotlib/lib/matplotlib/colorbar.py)あなたに設定drawedgesするTrueことで、それらの線を描くように言っていると思います。

于 2013-02-21T15:32:55.330 に答える
1

他の提案はどれもうまくいかなかったので、カラーバーインスタンスからアルファチャンネルを削除することになりました:

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)

面の色にアクセスする前に、カラーバーを一度描画する必要がありました。

于 2018-01-29T16:45:37.030 に答える