我想要绘制一些值:
{'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 :(得分:1)
我认为您可能正在寻找的是对数据的转换,以便更接近一个的值更加分散。有一些不同的功能可以做到这一点,我过去使用的是:
的值将决定接近值1的“拉伸”量。这里有一些代码证明了它的效果。
您可以使用许多其他转换(功能)。
另请注意,我使用了您提供的刻度标签,这显然看起来不太好(可能有一些太多)。希望这会有所帮助,并为您提供一个探索的领域。
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()