【问题标题】:How to set float values as scientific notation in matplotlib?如何在 matplotlib 中将浮点值设置为科学计数法?
【发布时间】:2016-04-08 00:36:04
【问题描述】:

我在seaborn 中有以下 float 结果:

[7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.3e-05, 7.4e-05, 7.3e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.3e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.3e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05]

如您所见,为我绘制禁用科学计数法的图表:

结果函数:

def result(values, time):
    x = 0.000000000001
    max = 0.000000001
    min = 0.001
    y = [(1.0*i*(max/min) for i in values]
    return generate((y, time))

以及生成图表的函数:

def generate(data_):
    data, time = data_
    img = StringIO.StringIO()
    sns.set_style("darkgrid")
    plt.plot(time, data)
    plt.savefig(img, format=format_)
    img.seek(0)
    x = base64.b64encode(img.getvalue())
    return x

以下消息来源告诉我seaborn 默认情况下以科学计数法设置值。但在这种情况下,我的结果是浮动的。

Seaborn showing scientific notation in heatmap for 3-digit numbers

Prevent scientific notation in seaborn boxplot

How to prevent numbers being changed to exponential form in Python matplotlib figure

How to avoid scientific notation when annotating a seaborn clustermap?

浮动结果重要吗?

【问题讨论】:

    标签: python matplotlib flask list-comprehension seaborn


    【解决方案1】:

    我不熟悉flask,但我认为您的问题可能出在绘图上,而不是其他问题。让我们剥离所有其他东西,只留下情节。我将您的代码简化为:

    import datetime
    import matplotlib.pyplot as plt
    
    import seaborn as sns
    sns.set_style("darkgrid")
    
    import numpy as np
    %matplotlib inline
    
    def generate(data_):
        data, time = data_
        plt.plot(time, data)
    
    def result(values, time):
        x = 0.000000000001
        max = 0.000000001
        min = 0.001
        y = [ 1.0*i*(max/min) for i in values ]
        return generate((y, time))
    
    values = [7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 
              7.4e-05, 7.4e-05, 7.3e-05, 7.4e-05, 7.3e-05, 7.4e-05, 
              7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 
              7.4e-05, 7.4e-05, 7.3e-05, 7.4e-05, 7.4e-05, 7.4e-05, 
              7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 
              7.4e-05, 7.4e-05, 7.3e-05, 7.4e-05, 7.4e-05, 7.4e-05, 
              7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 
              7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 
              7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 7.4e-05, 
              7.4e-05, 7.4e-05]
    
    time = [datetime.time(17, 44, 41), datetime.time(17, 45, 41), 
            datetime.time(17, 46, 41), datetime.time(17, 47, 41), 
            datetime.time(17, 48, 41), datetime.time(17, 49, 41), 
            datetime.time(17, 50, 41), datetime.time(17, 51, 41), 
            datetime.time(17, 52, 41), datetime.time(17, 53, 41), 
            datetime.time(17, 54, 41), datetime.time(17, 55, 41), 
            datetime.time(17, 56, 41), datetime.time(17, 57, 41), 
            datetime.time(17, 58, 41), datetime.time(17, 59, 41), 
            datetime.time(18, 0, 41), datetime.time(18, 1, 41), 
            datetime.time(18, 2, 41), datetime.time(18, 3, 41), 
            datetime.time(18, 4, 41), datetime.time(18, 5, 41), 
            datetime.time(18, 6, 41), datetime.time(18, 7, 41), 
            datetime.time(18, 8, 41), datetime.time(18, 9, 41), 
            datetime.time(18, 10, 41), datetime.time(18, 11, 41), 
            datetime.time(18, 12, 41), datetime.time(18, 13, 41), 
            datetime.time(18, 14, 41), datetime.time(18, 15, 41), 
            datetime.time(18, 16, 41), datetime.time(18, 17, 41), 
            datetime.time(18, 18, 54), datetime.time(18, 19, 55), 
            datetime.time(18, 20, 57), datetime.time(18, 21, 57), 
            datetime.time(18, 23, 3), datetime.time(18, 24, 27), 
            datetime.time(18, 25, 27), datetime.time(18, 26, 27), 
            datetime.time(18, 27, 27), datetime.time(18, 28, 27), 
            datetime.time(18, 29, 27), datetime.time(18, 30, 38), 
            datetime.time(18, 32, 4), datetime.time(18, 33, 12), 
            datetime.time(18, 34, 54), datetime.time(18, 35, 54), 
            datetime.time(18, 37, 34), datetime.time(18, 38, 34), 
            datetime.time(18, 40, 28), datetime.time(18, 41, 28), 
            datetime.time(18, 42, 28), datetime.time(18, 43, 28)]
    
    result(values,time)
    

    它给了我科学记数法的结果:

    试试这个代码,看看是否是科学记数法。如果没有,我敢打赌你需要将matplotlibseaborn 更新到最新版本。如果是这样,至少你知道有别的东西在搞砸你的标签。

    【讨论】:

      【解决方案2】:

      使用matplotlib.ticker.FormatStrFormatter 解决了问题

      import matplotlib.ticker as mtick
      
      def generate(data_):
          data, time = data_
          img = StringIO.StringIO()
          sns.set_style("darkgrid")
          plt.plot(time, data)
          plt.gca().yaxis.set_major_formatter(mtick.FormatStrFormatter('%.1E')) #this line solves the problem
          plt.savefig(img, format=format_)
          img.seek(0)
          x = base64.b64encode(img.getvalue())
          return x
      

      使用另一个时间我得到了这个图,y轴是科学计数法。

      请看这里documentation

      类 matplotlib.ticker.FormatStrFormatter(fmt)

      Bases: matplotlib.ticker.Formatter
      
      Use an old-style (‘%’ operator) format string to format the tick
      

      【讨论】:

        猜你喜欢
        • 2021-12-17
        • 2010-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-19
        相关资源
        最近更新 更多