如何在python或matplotlib中绘制非常小的值的条形图?

时间:2018-12-01 09:49:16

标签: python python-3.x matplotlib

我使用以下代码绘制了比较条形图,以获取非常小的值

import pandas as pd
import matplotlib.pyplot as plt

data = [[ 0.00790019035339353, 0.00002112],
    [0.0107705593109131, 0.0000328540802001953],
    [0.0507792949676514, 0.0000541210174560547]]

df = pd.DataFrame(data, columns=['A', 'B'])
df.plot.bar()

plt.bar(df['A'], df['B'])
plt.show()

由于值太小,我无法看到图表中(“ B”列)值较小(例如0.00002112)的图表颜色。

enter image description here

如何修改代码以在图形中可视化较小的值(B列)颜色?谢谢。

2 个答案:

答案 0 :(得分:3)

显示不同数量级数据的常见方法是 对y轴使用对数缩放。低于对数 可以使用基数为10的基数,但可以选择其他基数。

import pandas as pd
import matplotlib.pyplot as plt

data = [[ 0.00790019035339353, 0.00002112],
        [0.0107705593109131, 0.0000328540802001953],
        [0.0507792949676514, 0.0000541210174560547]]

df = pd.DataFrame(data, columns=['A', 'B'])
df.plot.bar()

plt.yscale("log")
plt.show()

enter image description here

更新: 要更改yaxis标签的格式,可以使用ScalarFormatter的实例:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter

data = [[ 0.00790019035339353, 0.00002112],
        [0.0107705593109131, 0.0000328540802001953],
        [0.0507792949676514, 0.0000541210174560547]]

df = pd.DataFrame(data, columns=['A', 'B'])
df.plot.bar()

plt.yscale("log")
plt.gca().yaxis.set_major_formatter(ScalarFormatter())
plt.show()

enter image description here

答案 1 :(得分:1)

您可以这样创建2个y轴:

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
width = 0.2
df['A'].plot(kind='bar', color='green', ax=ax1, width=width, position=1, label = 'A')
df['B'].plot(kind='bar', color='blue', ax=ax2, width=width, position=0, label = 'B')

ax1.set_ylabel('A')
ax2.set_ylabel('B')

# legend
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax1.legend(h1+h2, l1+l2, loc=2)

plt.show()

enter image description here