2013-07-29 16 views
8

Przygotowuję się do prezentacji i mam kilka przykładowych figurek figur 3D matplotlib. Linie siatki są jednak zbyt jasne, aby można je było zobaczyć na wyświetlanych obrazach. example 3D imageDopasowywanie linii siatki na rysunku 3D Matplotlib

Próbowałem za pomocą siatki-metodę, która działa na rysunkach 2D:

points = (5*np.random.randn(3, 50)+np.tile(np.arange(1,51), (3, 1))).transpose() 
fig = plt.figure(figsize = (10,10)) 
ax = fig.add_subplot(111, projection='3d') 
ax.scatter(points[:,0], points[:,1], points[:,2]) 
ax.view_init(elev=0., azim=0) 
ax.set_ylim([0, 60]) 
ax.set_zlim([0, 60]) 
ax.set_xlim([0, 60]) 
ax.set_zlabel('Cytokine') 
ax.set_ylabel('Parameter') 
ax.grid(linewidth=20) 

Ale to nie wydają się działać dla figur 3D. Jakieś sugestie?

Odpowiedz

3

Niestety to nie wydaje się być narażone. Patrząc na źródło, kluczową zmienną wewnętrzną jest wywołanie _AXINFO, które możemy przesłonić ostrożną podklasą.

enter image description here

Dodaj ten kod po utworzeniu rysunku, a styl to z dict custom_AXINFO:

from mpl_toolkits.mplot3d import Axes3D 
import mpl_toolkits.mplot3d.axis3d as axis3d 

# New axis settings 
custom_AXINFO = { 
    'x': {'i': 0, 'tickdir': 1, 'juggled': (1, 0, 2), 
      'color': (0.00, 0.00, 0.25, .75)}, 
    'y': {'i': 1, 'tickdir': 0, 'juggled': (0, 1, 2), 
      'color': (0.20, 0.90, 0.90, 0.25)}, 
    'z': {'i': 2, 'tickdir': 0, 'juggled': (0, 2, 1), 
      'color': (0.925, 0.125, 0.90, 0.25)},} 

class custom_XAxis(axis3d.Axis): 
    _AXINFO = custom_AXINFO 

class custom_YAxis(axis3d.Axis): 
    _AXINFO = custom_AXINFO 

class custom_ZAxis(axis3d.Axis): 
    _AXINFO = custom_AXINFO 

class custom_Axes3D(Axes3D): 
    def _init_axis(self): 
     '''Init 3D axes; overrides creation of regular X/Y axes''' 
     self.w_xaxis = custom_XAxis('x', self.xy_viewLim.intervalx, 
            self.xy_dataLim.intervalx, self) 
     self.xaxis = self.w_xaxis 
     self.w_yaxis = custom_YAxis('y', self.xy_viewLim.intervaly, 
          self.xy_dataLim.intervaly, self) 
     self.yaxis = self.w_yaxis 
     self.w_zaxis = custom_ZAxis('z', self.zz_viewLim.intervalx, 
          self.zz_dataLim.intervalx, self) 
     self.zaxis = self.w_zaxis 

     for ax in self.xaxis, self.yaxis, self.zaxis: 
      ax.init3d() 

# The rest of your code below, note the call to our new custom_Axes3D 

points = (5*np.random.randn(3, 50)+np.tile(np.arange(1,51), (3, 1))).transpose() 
fig = plt.figure(figsize = (10,10)) 
ax = custom_Axes3D(fig) 

To jest małpa-łatanie na to najgorszy i nie powinny być powołane do pracować dla późniejszych wersji.

Naprawianie kolorów jest łatwiejsze niż linii siatki, ponieważ wymaga to zastąpienia jednej z metod __init__, choć można to zrobić przy większej ilości pracy.

Wydaje się, że nie wydaje się to trudne dla użytkownika końcowego i dlatego mogę sobie wyobrazić, że można to naprawić w późniejszych wersjach.

+0

Wygląda na to, że teraz możesz zrobić ax.w_xaxis.plane.set_color ((1,0,0)); ax.w_xaxis.plane.set_alpha (0,5). Wygląda na to, że ignoruje kanał alfa w set_color, ale używa go w set_alpha. – Ben

16

Jeśli nie masz nic przeciwko tym, że wszystkie linie są grubsze, możesz dostosować domyślne ustawienia rc.

Biorąc pod uwagę wykres takich jak:

enter image description here

Możemy dodać:

import matplotlib as mpl 
mpl.rcParams['lines.linewidth'] = 2 

Aby zwiększyć domyślną szerokość linii wszystkich linii, dając w wyniku:

enter image description here

Altern atively, jeśli czujesz to wygląda brzydko, można użyć:

ax.w_xaxis.gridlines.set_lw(3.0) 
ax.w_yaxis.gridlines.set_lw(3.0) 
ax.w_zaxis.gridlines.set_lw(3.0) 

dostosować szerokość linii każdej osi do 3,0, produkujący

enter image description here

Aby zaktualizować kolor, tak siatka linie naprawdę pop, można dodać:

ax.w_xaxis._axinfo.update({'grid' : {'color': (0, 0, 0, 1)}}) 
ax.w_yaxis._axinfo.update({'grid' : {'color': (0, 0, 0, 1)}}) 
ax.w_zaxis._axinfo.update({'grid' : {'color': (0, 0, 0, 1)}}) 

która produkuje:

enter image description here

Metody są dość hacky, ale o ile wiem, nie ma prostszego sposobu osiągnięcia tych wyników !! Mam nadzieję że to pomoże; daj mi znać, jeśli potrzebujesz dalszej pomocy!

+0

@JudoWill - powinieneś zaakceptować tę odpowiedź, jeśli rozwiąże problem! – Jamie

Powiązane problemy