Matplotlib'de Renk Çubuğu Aralığı'nı ayarlama


156

Takip koduna sahibim:

import matplotlib.pyplot as plt

cdict = {
  'red'  :  ( (0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)),
  'green':  ( (0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)),
  'blue' :  ( (0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45))
}

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024)

plt.clf()
plt.pcolor(X, Y, v, cmap=cm)
plt.loglog()
plt.xlabel('X Axis')
plt.ylabel('Y Axis')

plt.colorbar()
plt.show()

Bu, belirtilen renk eşlemini kullanarak X ve Y eksenlerinde 'v' değerlerinin bir grafiğini üretir. X ve Y eksenleri mükemmel, ancak renk haritası min ve maks. V arasında yayılıyor. Renk haritasını 0 ile 1 arasında değişmeye zorlamak istiyorum.

Kullanmayı düşündüm:

plt.axis(...)

Eksenlerin aralıklarını ayarlamak, ancak bu yalnızca renk haritasına değil, yalnızca X ve Y'nin min ve maks.

Düzenle:

Açıklık için, değerleri (0 ... 0.3) olan bir grafiğim ve değerleri (0.2 ... 0.8) olan başka bir grafiğim olduğunu varsayalım.

Her iki grafikte de, renk çubuğunun aralığının (0 ... 1) olmasını isteyeceğim. Her iki grafikte de, yukarıdaki renk yelpazesi kullanılarak bu renk aralığının aynı olmasını istiyorum (böylece her iki grafikte de 0.25 aynı renk olacaktır). İlk grafikte, 0.3 ve 1.0 arasındaki tüm renkler grafikte yer almaz, ancak yandaki renk çubuğu tuşunda bulunur. Diğerinde, 0 ile 0.2 ve 0.8 ile 1 arasındaki tüm renkler grafikte bulunmayacak, yandaki renk çubuğunda olacaktır.

Yanıtlar:


177

Kullanılması vminve vmaxkuvvetler renkler için aralık. İşte bir örnek:

resim açıklamasını buraya girin

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

cdict = {
  'red'  :  ( (0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)),
  'green':  ( (0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)),
  'blue' :  ( (0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45))
}

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024)

x = np.arange(0, 10, .1)
y = np.arange(0, 10, .1)
X, Y = np.meshgrid(x,y)

data = 2*( np.sin(X) + np.sin(3*Y) )

def do_plot(n, f, title):
    #plt.clf()
    plt.subplot(1, 3, n)
    plt.pcolor(X, Y, f(data), cmap=cm, vmin=-4, vmax=4)
    plt.title(title)
    plt.colorbar()

plt.figure()
do_plot(1, lambda x:x, "all")
do_plot(2, lambda x:np.clip(x, -4, 0), "<0")
do_plot(3, lambda x:np.clip(x, 0, 4), ">0")
plt.show()

3
Bu cevap neden @Amro tarafından gönderilen plt.clim kullanan yanıtdan daha iyi?
Alex Lamson

90

CLIM işlevini kullanın ( MATLAB'daki CAXIS işlevine eşdeğer ):

plt.pcolor(X, Y, v, cmap=cm)
plt.clim(-4,4)  # identical to caxis([-4,4]) in MATLAB
plt.show()

2
Bence clim () renk eksenlerini ölçeklendirir, fakat renklerin kendileri değerleri değiştirir. Ölçek boyunca belirli bir kesitteki nokta, ölçek ne olursa olsun aynı renkte olacaktır, ancak temsil ettiği değer değişecektir.
Paul

4
Evet. Bu, askerin istenen davranışıdır, bu yüzden sorunu çözer: renk skalası grafikler arasında aynıdır.
Excalabur

16

Bunun en zarif çözüm olup olmadığından emin değilim (kullandığım budur), ancak verilerinizi 0 ila 1 arasında ölçeklendirebilir ve ardından renk çubuğunu değiştirebilirsiniz:

import matplotlib as mpl
...
ax, _ = mpl.colorbar.make_axes(plt.gca(), shrink=0.5)
cbar = mpl.colorbar.ColorbarBase(ax, cmap=cm,
                       norm=mpl.colors.Normalize(vmin=-0.5, vmax=1.5))
cbar.set_clim(-2.0, 2.0)

İki farklı sınırla renk çubuğunun aralığını ve göstergesini kontrol edebilirsiniz. Bu örnekte, çubukta yalnızca -0.5 ila 1.5 arasındaki aralık gösterilirken, renk haritası -2 ila 2'yi kaplar (bu nedenle ölçeklemeden önce kaydettiğiniz veri aralığınız olabilir).

Böylece renk haritasını ölçeklemek yerine verilerinizi ölçeklendirir ve renk çubuğunu buna uyarlarsınız.


1
Bence bu çok farklı bir şey yapıyor… üzgünüm sorumda yeterince kesin değildim. Çözümünüz renkleri ölçeklendirecek, böylece 1.0 değerini temsil eden şey artık verilerimdeki maksimum değeri temsil edecek. Renk çubuğu ihtiyacım olarak 0..1 gösterecektir (vmin = 0, vmax = 1 ile), ancak bu maksimum değerin üzerindeki her şey aynı renkte olacak ...
Paul

1
... neyin peşinde olduğumu daha net göstermek için sorumu güncelledim. Çok belirsiz olsaydım üzgünüm.
Paul

10

Şekil ortamını ve .set_clim () yöntemini kullanma

Birden fazla parseliniz varsa bu alternatif daha kolay ve daha güvenli olabilir:

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

cdict = {
  'red'  :  ( (0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)),
  'green':  ( (0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)),
  'blue' :  ( (0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45))
}

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024)

x = np.arange(0, 10, .1)
y = np.arange(0, 10, .1)
X, Y = np.meshgrid(x,y)

data = 2*( np.sin(X) + np.sin(3*Y) )
data1 = np.clip(data,0,6)
data2 = np.clip(data,-6,0)
vmin = np.min(np.array([data,data1,data2]))
vmax = np.max(np.array([data,data1,data2]))

fig = plt.figure()
ax = fig.add_subplot(131)
mesh = ax.pcolormesh(data, cmap = cm)
mesh.set_clim(vmin,vmax)
ax1 = fig.add_subplot(132)
mesh1 = ax1.pcolormesh(data1, cmap = cm)
mesh1.set_clim(vmin,vmax)
ax2 = fig.add_subplot(133)
mesh2 = ax2.pcolormesh(data2, cmap = cm)
mesh2.set_clim(vmin,vmax)
# Visualizing colorbar part -start
fig.colorbar(mesh,ax=ax)
fig.colorbar(mesh1,ax=ax1)
fig.colorbar(mesh2,ax=ax2)
fig.tight_layout()
# Visualizing colorbar part -end

plt.show()

resim açıklamasını buraya girin

Tek bir renk çubuğu

Daha sonra en iyi alternatif, tüm çizim için tek bir renk çubuğu kullanmaktır. Bunu yapmanın farklı yolları vardır, bu öğretici en iyi seçeneği anlamak için çok yararlıdır. Kodun önceki görselleştirme renk çubuğu kısmı yerine kopyalayıp yapıştırabileceğiniz bu çözümü tercih ederim .

fig.subplots_adjust(bottom=0.1, top=0.9, left=0.1, right=0.8,
                    wspace=0.4, hspace=0.1)
cb_ax = fig.add_axes([0.83, 0.1, 0.02, 0.8])
cbar = fig.colorbar(mesh, cax=cb_ax)

resim açıklamasını buraya girin

PS

Daha hızlı ( burada daha fazla bilgi ) olduğu için pcolormeshyerine kullanmanızı öneririm .pcolor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.