如何在Python或Matplotlib中绘制极小值的柱状图?

4
我使用以下代码画出了非常小数值的比较条形图:
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个回答

5
一种展示具有不同数量级的数据的常用方法是使用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

更新: 要更改y轴标签的格式,可以使用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


非常感谢LuckyJosh。这也是一个很好的选项来绘制这种类型的图形。谢谢。 - user1999109
LuckyJosh:从图形输出可视化的角度来看,您的解决方案非常好且易于操作。是否有选项可以显示y轴值的精确值(例如0.00002112),而不是10^-4的形式?如果可能的话,请尝试指导显示小数部分位数的长度(例如0.00或0.00000)。如果可以的话,这将对未来很有帮助。谢谢。 - user1999109
你可以这样做(我会在有时间时添加到我的答案中),但一般我不建议你这样做。如果你需要精确值,应该将其放在某种表格中,绘图对于比较和可视化趋势很好,但不适合数据检索。 - LuckyJosh
当然,我会采纳您的建议。我的要求是比较两个值,并希望新手也能理解输出结果。因此,我请求您提供基于数字和数字的X、Y轴值。在您有空的时候,可以分享您的答案。感谢您的回复。 - user1999109
你想在y轴上有精确的数值,还是只想将科学计数法格式更改为十进制格式(0.001而不是10^-3)? - LuckyJosh
不需要精确值,只需将科学计数法转换为十进制计数法(0.001而不是10^-3)即可。谢谢。 - user1999109

3
你可以像这样创建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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接