如何在 matplotlib 中将浮点值设置为科学记数法?
How to set float values as scientific notation in matplotlib?
我在 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
默认情况下以科学记数法设置值。但在这种情况下,我得到的是浮动结果。
How to prevent numbers being changed to exponential form in Python matplotlib figure
How to avoid scientific notation when annotating a seaborn clustermap?
浮动结果重要吗?
我不熟悉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)
它用科学记数法给出结果:
试试这个代码,看看是否使用科学记数法。如果没有,我敢打赌您需要将 matplotlib
和 seaborn
更新到最新版本。如果是这样,至少您知道是其他东西搞砸了您的标签。
使用 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
使用另一个 time 和 values 我得到了这个图,带有科学记数法的 yaxis。
看这里 documentation
class matplotlib.ticker.FormatStrFormatter(fmt)
Bases: matplotlib.ticker.Formatter
Use an old-style (‘%’ operator) format string to format the tick
我在 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
默认情况下以科学记数法设置值。但在这种情况下,我得到的是浮动结果。
How to prevent numbers being changed to exponential form in Python matplotlib figure
How to avoid scientific notation when annotating a seaborn clustermap?
浮动结果重要吗?
我不熟悉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)
它用科学记数法给出结果:
试试这个代码,看看是否使用科学记数法。如果没有,我敢打赌您需要将 matplotlib
和 seaborn
更新到最新版本。如果是这样,至少您知道是其他东西搞砸了您的标签。
使用 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
使用另一个 time 和 values 我得到了这个图,带有科学记数法的 yaxis。
看这里 documentation
class matplotlib.ticker.FormatStrFormatter(fmt)
Bases: matplotlib.ticker.Formatter Use an old-style (‘%’ operator) format string to format the tick