Matplotlib:绘制扭曲的轴

时间:2017-04-04 23:54:57

标签: python 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]

我搜索了文档,但似乎没有简单的方法可以做到这一点。

请注意,这些实际上是百分比,因此折叠更改或转换为日志比例将无法正常工作。

1 个答案:

答案 0 :(得分: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()