【问题标题】:How to draw bar charts for very small values in python or matplotlib?如何在 python 或 matplotlib 中为非常小的值绘制条形图?
【发布时间】:2018-12-01 09:49:16
【问题描述】:

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

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)的图表颜色。

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

【问题讨论】:

    标签: python python-3.x matplotlib


    【解决方案1】:

    显示不同数量级数据的常用方法是 对 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()
    

    更新: 要更改 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()
    

    【讨论】:

    • 非常感谢LuckyJosh..这也是画这种图的好选择..谢谢..
    • LuckyJosh:- 从图形输出可视化的角度来看,您的解决方案非常好且简单。是否有任何选项可以以精确值(如 0.00002112 )而不是 10^-4 的形式显示 y 轴值。如果可能意味着尝试引导小数部分数字长度显示(如 0.00 或 0.00000)。如果意味着它将对未来有所帮助。谢谢..
    • 你可以(我会在我有时间的时候为我的答案添加一个方法),但总的来说我不建议你这样做。如果您需要确切的值,则应将其放在某种类型的表中,绘图有助于比较和可视化趋势,但不适用于数据检索。
    • 当然.. 我接受你的建议。我的要求是比较这两个值,也想了解新手的输出。所以只有我要求您提供基于数字和数字的 X、Y 轴值。您可以在空闲时间分享您的答案。感谢您的回复..
    • 您想要在 y 轴上有准确的值,还是只想将格式从科学计数法更改为十进制计数法(0.001 而不是 10^-3)?
    【解决方案2】:

    您可以像这样创建 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()
    

    【讨论】:

      猜你喜欢
      • 2018-05-18
      • 1970-01-01
      • 2018-03-10
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 2012-07-21
      相关资源
      最近更新 更多