2017-04-04 4 views
0

ich eine Reihe von Werten, die ich Grundstück will:Matplotlib: Plotten verzerrt Achsen

{'A': 0.9823, 'B': 0.9133, 'C': 0.9987, 'D': 0.7332, 'E': 0.1345, 'F': 0.9235} 

Eine einfache Balkendiagramm davon, entlang der Bereich von y-Werten [0, 1], würde einige sehr groß sehen Bars und ein paar kürzere (D und E). Ich möchte die Anzeige der Variabilität in Höhen von, anstelle von y tickmarks betonen:

[0, 0.1, 0.2, 0.3...0.8, 0.9, 1] 

haben wir:

[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.99, 0.999, 1] 

Ich habe die Dokumente gesucht, aber es scheint nicht zu sein einfache Möglichkeit, dies zu tun.

Beachten Sie, dass dies tatsächlich Prozentsätze sind, also Falte Änderungen oder Umwandlung in eine Protokollskala funktioniert nicht so gut.

+0

Wie wollen Sie zum Beispiel zur Karte Ihr erster Wert 0,9823 zu einem Ordinatenwert zwischen 0,9 und 0,99? Linear? – klimaat

Antwort

1

Ich denke, was Sie möglicherweise suchen, ist eine Transformation für Ihre Daten, so dass Werte näher zu einem sind mehr voneinander beabstandet. Es gibt ein paar verschiedene Optionen für die Funktionen, die dies tun, das ich in der Vergangenheit verwendet habe, ist:

formula

Wenn der Wert von formula die Menge an „Strecken“ in der Nähe von Werten von 1. bestimmt hier ist ein Code, der den Effekt zeigt, den dies hat.

Es gibt viele andere Transformationen (Funktionen), die Sie verwenden können.

Beachten Sie auch, dass ich die Tick-Etiketten verwendet habe, die Sie offensichtlich nicht gut aussehen (es gibt wahrscheinlich ein paar zu viele). Hoffe, das hilft und gibt Ihnen einen Bereich zum Erkunden.

Axes tranformations

import matplotlib.pyplot as plt 
import numpy as np 

data = {'A': 0.9823, 'B': 0.9133, 'C': 0.9987, 'D': 0.7332, 'E': 0.1345, 'F': 0.9235} 
yticks = np.array([0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.99, 0.999, 1]) 

fig, ax = plt.subplots(1,4, figsize=(16,4)) 

ax[0].bar(left=range(len(data)), height=np.array(data.values()), tick_label=data.keys()) 
ax[0].set_ylim(yticks[0], yticks[-1]) 
ax[0].set_title('Original scale') 

epsilon = .1 
ax[1].bar(left=range(len(data)), height=1/(1+epsilon-np.array(data.values())), tick_label=data.keys()) 
ax[1].set_yticks(1/(1+epsilon-yticks)) 
ax[1].set_yticklabels(yticks) 
ax[1].set_ylim(1/(1+epsilon-yticks[0]),1/(1+epsilon-yticks[-1])) 
ax[1].set_title(r'$\epsilon=0.5$') 

epsilon = .05 
ax[2].bar(left=range(len(data)), height=1/(1+epsilon-np.array(data.values())), tick_label=data.keys()) 
ax[2].set_yticks(1/(1+epsilon-yticks)) 
ax[2].set_yticklabels(yticks) 
ax[2].set_ylim(1/(1+epsilon-yticks[0]),1/(1+epsilon-yticks[-1])) 
ax[2].set_title(r'$\epsilon=0.1$') 

epsilon = .01 
ax[3].bar(left=range(len(data)), height=1/(1+epsilon-np.array(data.values())), tick_label=data.keys()) 
ax[3].set_yticks(1/(1+epsilon-yticks)) 
ax[3].set_yticklabels(yticks) 
ax[3].set_ylim(1/(1+epsilon-yticks[0]),1/(1+epsilon-yticks[-1])) 
ax[3].set_title(r'$\epsilon=0.05$') 

fig.show()