2013-05-10 41 views
8

Son birkaç günümü, bir 3B grafiğinde eksenlerden küçük kenar boşluklarını gidermenin bir yolunu bulmaya çalışarak geçirdim. ax.margins(0) ve ax.autoscale_view('tight') ve diğer yaklaşımları denedim, ancak bu küçük kenar boşlukları hala var. Özellikle, çubuk histogramlarının yükselmiş olmasını sevmiyorum, yani dipleri sıfır seviyesinde değil - örnek resime bakınız. 3B grafiğinde eksen kenar boşluklarını çıkarma

gnuplot yılında unwanted margins on all axes

, ben "0 olarak belirlenmiştir xyplane" kullanacaktır. Matplotlib'de, her iki tarafta her eksende marjlar olduğundan, bunların her birini kontrol edebilmek harika olurdu.

Düzenleme: HYRY çözeltisi oldukça altında çalışır, ancak 'X' ekseni Y'de üzerinde çizilen bir ızgara hattı = 0 alır: özellik veya yöntem

strange axis

+0

arsa yapmak için kullanıyorsun, bu yüzden bir başlangıç ​​noktamız var. Ardından, kullanıcıların kodu kopyalayıp yapıştırmaları daha kolay olur ve daha sonra bu sorun için bir çözüm bulursunuz. – hooy

+0

Örnek kodun birçoğunu [burada] (http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html) ("Bar grafikleri" örneği, yukarıdaki durumumla benzerdir). – dolphin

cevap

6

var olduğu için değil bu kenar boşluklarını değiştirin. Kaynak kodunu yamanalısınız.

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import numpy as np 
###patch start### 
from mpl_toolkits.mplot3d.axis3d import Axis 
if not hasattr(Axis, "_get_coord_info_old"): 
    def _get_coord_info_new(self, renderer): 
     mins, maxs, centers, deltas, tc, highs = self._get_coord_info_old(renderer) 
     mins += deltas/4 
     maxs -= deltas/4 
     return mins, maxs, centers, deltas, tc, highs 
    Axis._get_coord_info_old = Axis._get_coord_info 
    Axis._get_coord_info = _get_coord_info_new 
###patch end### 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
for c, z in zip(['r', 'g', 'b', 'y'], [30, 20, 10, 0]): 
    xs = np.arange(20) 
    ys = np.random.rand(20) 

    # You can provide either a single color or an array. To demonstrate this, 
    # the first bar of each set will be colored cyan. 
    cs = [c] * len(xs) 
    cs[0] = 'c' 
    ax.bar(xs, ys, zs=z, zdir='y', color=cs, alpha=0.8) 

ax.set_xlabel('X') 
ax.set_ylabel('Y') 
ax.set_zlabel('Z') 

plt.show() 

sonucudur:

enter image description here

düzenleme

ızgara çizgileri rengini değiştirmek için: Burada bir örnek

for axis in (ax.xaxis, ax.yaxis, ax.zaxis): 
    axis._axinfo['grid']['color'] = 0.7, 1.0, 0.7, 1.0 

Edi t2

Seti X & Y lim:

ax.set_ylim3d(-1, 31) 
ax.set_xlim3d(-1, 21) 
+0

Teşekkür ederim, işe yaradı ... (1) eğer c, z için z'yi değiştirirsem (['r', 'g', 'b', 'y'], [30, 20, 10, 2]) ', neden' X 'ekseni kalın kesik çizgi stili alır? (2) Izgara çizgilerinin renkleri nasıl değiştirilir? ax.grid (color = 'blue') 'çalışmıyor. – dolphin

+0

@dolphin, (1) sonucunu gönderir misiniz? (2) için, renk bazı API tarafından değiştirilemez, gizli _axinfo dict değiştirilen kodu ekledim. – HYRY

+0

(2) için teşekkürler! Matplotlib'in karmaşıklığı ve esnekliğinin, tek tek aranması gereken çok sayıda “hack” ile sonuçlanması ve sezgisel çözümlerin bazen işe yaramayacağı, utanç verici olması utanç verici.(1) ile ilgili olarak, bir görüntüyü bir görüntüye gönderemedim, böylece bir parçayı kodlayabileceğimi umarak bir parça kod yazdım :-) Şimdi orijinal sorudaki Edit (Düzenle) olarak başka bir resim ekledim. – dolphin

0

çünkü benim durumda, hafif kabul çözelti çimdik zorunda x ve y eksenleri (değil z), ek bir payına sahip olan, mins, maxs, deltas yazdırarak deltas * 6.0/11 olduğu ortaya çıktı. İşte benim durumumda işe yarayan güncellenmiş yama.

###patch start### 
from mpl_toolkits.mplot3d.axis3d import Axis 
def _get_coord_info_new(self, renderer): 
    mins, maxs, cs, deltas, tc, highs = self._get_coord_info_old(renderer) 
    correction = deltas * [1.0/4 + 6.0/11, 
          1.0/4 + 6.0/11, 
          1.0/4] 
    mins += correction 
    maxs -= correction 
    return mins, maxs, cs, deltas, tc, highs 
if not hasattr(Axis, "_get_coord_info_old"): 
    Axis._get_coord_info_old = Axis._get_coord_info 
Axis._get_coord_info = _get_coord_info_new 
###patch end### 

(Ben de, biraz etrafına yama mantığı değiştirdik böylece bu işlevi düzenleme ve şimdi Jupyter beklenen çalışmaları olarak. Onun modülünü yeniden) Kodu ekledikten eğer gerçekten yardımcı olacağını