2017-04-04 142 views
0

我有一堆,我想情節值:Matplotlib:繪製扭曲軸

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

這些中的簡單的條形圖,沿y值的範圍爲[0,1],將看到一些非常高酒吧,和一些較短的(D和E)。我想用加重變異的顯示器的高度,而不是具有y個刻度線:

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

我們:

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

我搜索的文檔,但似乎沒有簡單的方法來做到這一點。

請注意,這些實際上是百分比,所以摺疊更改或轉換爲日誌規模將無法很好地工作。

+0

你計劃如何映射例如你的第一個值是0.9823到0.9到0.99之間的縱座標值?線性? – klimaat

回答

1

我想你可能要找的是對你的數據進行的轉換,以便更接近於一個的值更加分開。有對功能,將做到這一些不同的選擇,一個我在過去使用的是:

formula

formula值將決定「拉伸」的1附近值以下的量是一些代碼證明了這種影響。

還有很多其他可以使用的轉換(函數)。

另請注意,我使用了您提供的刻度標籤,這顯然看起來不太好(可能有很多)。希望這會有所幫助,併爲您提供一個探索領域。

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()