0

I've in seaborn the following float results:

[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]

Plotting me a graph with the scientific notation disabled as you can see:

Plot from list

The result function:

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))

And the function who generate the graph:

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

The following sources tell me that seaborn by default set the values in scientific notation. But in this case I'm having float results.

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?

Do float results matters?

Community
  • 1
  • 1
Shapi
  • 5,493
  • 4
  • 28
  • 39

2 Answers2

1

Using matplotlib.ticker.FormatStrFormatter solved the problem

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

Using another time and values I got this plot, with the yaxis in scientific notation.

enter image description here

See here the documentation

class matplotlib.ticker.FormatStrFormatter(fmt)

Bases: matplotlib.ticker.Formatter

Use an old-style (‘%’ operator) format string to format the tick
Shapi
  • 5,493
  • 4
  • 28
  • 39
0

I am not familiar with flask, but I think you problem may be in plotting, not something else. Let's strip away all other stuff, leave only the plot. I reduced your code to this:

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)

And it gives me result with scientific notation:

scientific notation by default

Try this code and see if makes scientific notation or not. If not, my bet is you need to update matplotlib and seaborn to the last version. If it does, at least you know that something else is screwing up your labels.

Sergey Antopolskiy
  • 3,970
  • 2
  • 24
  • 40