2011-10-13 23 views
11

matplotlib: Saydam arka planla ikinci eksenleri() eklemek?

fig = plt.figure() 
ax = plt.axes() 
fig.add_subplot(ax) 
ax.plot(x,y) 

ben açıklamak üzere olduğum şey aynı şeyi yapar halde

newax = plt.axes(axisbg='none') 

bana ValueError: Unknown element o verir ikinci ekseni ekleme verileri

x = np.linspace(0,2*np.pi,100) 
y = 2*np.sin(x) 

Plot tanımlayın.

newax = plt.axes() 
fig.add_subplot(newax) 
newax.set_axis_bgcolor('none') 

Ancak, (ya da şekil arka plan ne olursa olsun) "gri" orijinal şeklin arka plan rengini açar: Ben de bu aynı şeyi yapmak için (hiçbir hata) çalıştığını görebilir? Anladığım gibi, bu rakamın eksenleri ve kutunun dışında yeni bir transparan olacağını düşünüyorum. Ben sıralamasını değiştirmek bile, aynı şey:

plt.close('all') 
fig = plt.figure() 
newax = plt.axes() 
fig.add_subplot(newax) 
newax.set_axis_bgcolor('none') 
ax = plt.axes() 
fig.add_subplot(ax) 
ax.plot(x,y) 

Ben birinin arka plan diğer yer paylaşabilir düşündüm çünkü bu şaşırtıcı, ama her iki durumda görünür gibi görünen newax arka plan (veya en azından bu gördüğüm renk.

Burada neler oluyor?

cevap

37

Aslında yeni bir eksen eklemiyorsunuz.

Matplotlib, bu konumda zaten bir çizim olduğunu ve yeni bir eksen nesnesi yerine döndürdüğünü algılıyor.

(kendiniz için kontrol edin. ax ve newax aynı nesne olacaktır.)

var burada muhtemelen isterdim neden bir neden değil, ama bunu yapardım nasıl.

(Ayrıca, newax = plt.axes() demiyorlar ve sonra iki kez aynı şeyi yapıyoruz fig.add_subplot(newax) diyoruz.)

Edit: matplotlib yeni (?> = 1.2, sanırım) sürümleri ile, başarabilirsiniz Aşağıdaki örnekle aynı şekilde label kwarg kullanarak fig.add_subplot. Örneğin. Tabii newax = fig.add_subplot(111, label='some unique string')

import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 

# If you just call `plt.axes()` or equivalently `fig.add_subplot()` matplotlib 
# will just return `ax` again. It _won't_ create a new axis unless we 
# call fig.add_axes() or reset fig._seen 
newax = fig.add_axes(ax.get_position(), frameon=False) 

ax.plot(range(10), 'r-') 
newax.plot(range(50), 'g-') 
newax.axis('equal') 

plt.show() 

enter image description here

, bu korkunç görünüyor, ama ben sadece bir eklemek istediğiniz önceki sorulardan tahmin ediyorum için ...

Eğer sorduğun buysa ikinci x ekseni? Eğer öyleyse, bu tamamen farklı bir şey.

Eğer y eksenlerini birbirine bağlamak istiyorsanız, o zaman böyle bir şey yapın (biraz ayrıntılı ...):

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots() 
fig.subplots_adjust(bottom=0.2) 

newax = fig.add_axes(ax.get_position()) 
newax.patch.set_visible(False) 
newax.yaxis.set_visible(False) 

for spinename, spine in newax.spines.iteritems(): 
    if spinename != 'bottom': 
     spine.set_visible(False) 

newax.spines['bottom'].set_position(('outward', 25)) 

ax.plot(range(10), 'r-') 

x = np.linspace(0, 6*np.pi) 
newax.plot(x, 0.001 * np.cos(x), 'g-') 

plt.show() 
: Bir gizli, bağlantısız y eksenini, ve tamamen yeni bir x eksenini olmasını istiyorsanız

import matplotlib.pyplot as plt 

fig, ax = plt.subplots() 
newax = ax.twiny() 

# Make some room at the bottom 
fig.subplots_adjust(bottom=0.20) 

# I'm guessing you want them both on the bottom... 
newax.set_frame_on(True) 
newax.patch.set_visible(False) 
newax.xaxis.set_ticks_position('bottom') 
newax.xaxis.set_label_position('bottom') 
newax.spines['bottom'].set_position(('outward', 40)) 

ax.plot(range(10), 'r-') 
newax.plot(range(21), 'g-') 

ax.set_xlabel('Red Thing') 
newax.set_xlabel('Green Thing') 

plt.show() 

enter image description here

, o zaman böyle bir şey yapmak istiyorum

enter image description here

newax üzerinde çizilen her şey için y ekseni değerlerinin hiçbir zaman gösterilmediğini unutmayın.

Eğer isteseydim

, hatta (... bundan noktası ne olacağını tam olarak emin değilim ama düzgün görünüyor) ayrıca bunu bir adım öteye ve bağımsız x ve y eksenleri olabilir:

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots() 
fig.subplots_adjust(bottom=0.2, right=0.85) 

newax = fig.add_axes(ax.get_position()) 
newax.patch.set_visible(False) 

newax.yaxis.set_label_position('right') 
newax.yaxis.set_ticks_position('right') 

newax.spines['bottom'].set_position(('outward', 35)) 

ax.plot(range(10), 'r-') 
ax.set_xlabel('Red X-axis', color='red') 
ax.set_ylabel('Red Y-axis', color='red') 

x = np.linspace(0, 6*np.pi) 
newax.plot(x, 0.001 * np.cos(x), 'g-') 

newax.set_xlabel('Green X-axis', color='green') 
newax.set_ylabel('Green Y-axis', color='green') 


plt.show() 

enter image description here

Ayrıca sadece arsa altındaki fazladan omurgayı ekleyebilir. Bazen bu daha kolay, özellikle de keneler veya sayısal şeyler istemiyorsanız. Çok fazla kendi cevaplar birini takmak için, ama bu bir örnek var burada: Bir aracılığıyla bağlanan farklı x ve y eksenleri yapmak istiyorsanız How do I plot multiple X or Y axes in matplotlib?

biri olarak son şey, parasite axes examples bakmak emin olun özgül dönüşüm.

+0

Evet, aslında iki eksen hakkındaydı ... 'Twinx' ve şimdi 'twiny' (sanırım ikinci var olduğunu tahmin etmeliydim) almadım ama ihtiyaç duyduklarını düşünmedim. arsa genişliği aynı olduğu sürece "bağlantılı" olmak zorundadır (çünkü limitleri o zamana eşit olarak ayarlayabilirim). – hatmatrix

+0

Eğer bunu yapmaya istekli olsaydım, bu ilk örnek diğer dikenlerin görünürlüğünü kapatarak da işe yarayabilirdi. Matplotlib'deki her bir metotta, var olan "kolaylık" fonksiyonlarının her birini öğrenmek zorunda kalmadan, çoğu durumda uygulanabilecek birkaç "genel" fonksiyona gideceğime dair çok fazla varyasyon var gibi görünüyor ... ama teşekkürler, bu çözüyor herşey. Ama plt.axes() aynı nesneyi geri döndüren bir sürprizdi - diye düşündüm plt.gca() bunun için. Ve bu Matlab'dan farklı ... – hatmatrix

+0

Eh, 'plt.axes()' diğer herhangi bir durumda yeni bir eksen oluşturur. Sadece o konumda bir eksenin olup olmadığını kontrol eden bir kod parçasına sahiptir ve eğer öyleyse onu döndürür (ve mevcut ekseni yapar). (Temel olarak, "plt.axes()" belgesindeki 3. mermi noktası, satırlar arasında okumanız gerekse de ...) –

İlgili konular