2015-05-26 15 views
6

Ich möchte Diagramme mit Achsenbeschriftungen sowohl an den Oberseiten und Unterseiten (oder links und rechts) meiner Unterfiguren erzeugen. Andere Beiträge haben ausführlich beschrieben, wie ich die Achsenbeschriftungen verschieben kann (z. B. here).Exponentielle Bewegungsachse in Matplotlib

Allerdings habe ich ein Problem mit den Exponentialfunktionen aus wissenschaftlicher Notation. Ein minimal-ish Beispiel arbeiten illustriert das Problem am besten:

import numpy as np 
import matplotlib.pyplot as plt 

vars = 4 
length = 10000 

array = np.zeros((length, vars)) 
array[:,0] = np.random.normal(0.0, 1.0e6, (length)) 
array[:,1] = 1.0e6 * np.tanh(array[:,0]/1.0e6) 
array[:,2] = 1.0e5 * np.random.random((length)) 
array[:,3] = array[:,1] * array[:,2]/1.0e5 

labels = ["var1", "var2", "var3", "var4"] 

plt.figure(figsize=(15, 15)) 

for i in range(vars): 
    for j in range(0, vars): 
     ax = plt.subplot(vars, vars, vars*i + j + 1) 
     ax.xaxis.get_major_formatter().set_powerlimits((-2, 3)) 
     ax.yaxis.get_major_formatter().set_powerlimits((-2, 3)) 
     ax.locator_params(nbins=5) 

     if (j == i): 
      weights = np.ones_like(array[:,i])/len(array[:,i]) 
      ax.hist(array[:,i], 25, weights=weights) 
     else: 
      ax.plot(array[:,j], array[:,i], '.', markersize=0.5) 

     if ((j == 0) & (i % 2 == 0)): 
      ax.yaxis.tick_left() 
      ax.xaxis.set_ticks_position("both") 
      ax.yaxis.set_label_position("left") 
      ax.get_yaxis().get_offset_text().offset_text_position = "left" 
      ax.set_ylabel(labels[i]) 
     elif ((j == vars - 1) & (i % 2 == 1)): 
      ax.yaxis.tick_right() 
      ax.xaxis.set_ticks_position("both") 
      ax.yaxis.set_label_position("right") 
      ax.get_yaxis().get_offset_text().offset_text_position = "right" 
      ax.set_ylabel(labels[i]) 
     else: 
      ax.get_yaxis().set_ticklabels([]) 

     if ((i == 0) & (j % 2 == 1)): 
      ax.xaxis.tick_top() 
      ax.xaxis.set_ticks_position("both") 
      ax.xaxis.set_label_position("top") 
      ax.get_xaxis().get_offset_text().offset_text_position = "top" 
      ax.set_xlabel(labels[j]) 
     elif ((i == vars - 1) & (j % 2 == 0)): 
      ax.xaxis.tick_bottom() 
      ax.xaxis.set_ticks_position("both") 
      ax.xaxis.set_label_position("bottom") 
      ax.get_xaxis().get_offset_text().offset_text_position = "bottom" 
      ax.set_xlabel(labels[j]) 
     else: 
      ax.get_xaxis().set_ticklabels([]) 

plt.savefig("test.png") 

Dies erzeugt: enter image description here

Wie Sie sehen können, haben die Exponentialgrößen nicht mit dem Rest der Zecken bewegt. Ich habe versucht,

ax.get_yaxis().get_offset_text().offset_text_position = "right" 

und

ax.get_xaxis().get_offset_text().offset_text_position = "top" 

aber sie scheinen keine Wirkung zu haben.

+0

Für was es wert ist, ist der "Offset-Text" der Offset (z. B. '+ 1e3') nicht der Multiplikator (' 1e3'), weshalb 'get_offset_text(). Offset_text_position' keinen Effekt hat. –

+0

Ah, das macht eigentlich Sinn! Ich hatte angenommen, dass "Offset" sich auf die Position des Textes bezog, nicht auf den tatsächlichen Inhalt. Wissen Sie, was ich stattdessen tun sollte? –

+1

Ignorieren Sie, was ich über den Unterschied zwischen dem Offset und dem Multiplikator gesagt habe (obwohl es auch eine gemeinsame Sache gibt, zB: http://stackoverflow.com/questions/28371674/prevent-scientific-notation-in-matplotlib-pyplot/28373421 # 28373421) Die Wurzel Ihres Problems ist, dass Sie 'ax.xaxis.offset_text_position =" top "' anstelle von 'ax.xaxis.get_offset_text(). Offset_text_position() =" top "' wollen. –

Antwort