2017-04-04 105 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()