【问题标题】:Reducing decimal places in scientific notation减少科学计数法中的小数位数
【发布时间】:2021-03-07 13:02:41
【问题描述】:

我从一个名为 t_array_hr 的 txt 文件中读出了一个数组

['4.155890E+11', '4.155893E+11', '4.155896E+11', ...,'2.723167E+14', '2.723167E+14', '2.723167E+14']

我离开 ... 的原因是因为整个数组有数千个值。 我在下图中使用这个数组作为 x 轴。我的问题是 x 轴值在科学计数法中的小数位太多。我想将它们保留为科学计数法,但将小数位减少并四舍五入到 2(4.15589e11 到 4.16e11)。

我的代码如下

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import ticker
from matplotlib.ticker import MaxNLocator

stellarModel = open('filepath', 'r')
i = 0
tstep = 0
dtype = object    
dataframe_hr = pd.read_csv(stellarModel,delim_whitespace=True,header=None,low_memory=False,names=np.arange(14),dtype={'0':np.int16,'1':np.int16,'2':np.float16,'3':np.float16,'4':np.float16,'5':np.float16,'6':np.float16,'7':np.float16,'8':np.float16,'9':np.float16,'10':np.float16,'11':np.float16,'12':np.float16,'13':np.float16})
nrows = np.shape(dataframe_hr)[0]
    

T_array_hr = []
L_array_hr = []
t_array_hr = []
r_array_hr = []
M_array_hr=[]    
Mdot_hr=[]
vinf_hr=[]

for i in range(nrows):
        if i%55 == 0:
            T_array_hr.append(dataframe_hr[7][i])
            L_array_hr.append(dataframe_hr[6][i])
            t_array_hr.append(dataframe_hr[1][i])
            r_array_hr.append(dataframe_hr[4][i])
            Mdot_hr.append(dataframe_hr[9][i])
            vinf_hr.append(dataframe_hr[11][i])
            M_array_hr.append(dataframe_hr[8][i])

fig = plt.figure(1, figsize = (10,6))

axes = fig.add_axes([0.2, 0.1, 0.8, 1.0]) # left, bottom, width, height
axes.plot(t_array_hr, Mdot_hr)
axes.set_xlabel('Time')
axes.set_ylabel('Mass Loss')
axes.set_title('Rate of Mass Loss over Time')
axes.invert_yaxis()
axes.xaxis.set_major_locator(MaxNLocator(6))

有人知道如何在不影响科学计数法的情况下减少小数位吗?

【问题讨论】:

  • 你的数组有字符串。您需要将其转换为浮点数(或其他数字数据类型)。例如:t_array_hr = [float(n) for n in t_array_hr]。或其他名称,如果您想保留原始字符串列表。
  • 顺便说一句,这就是它从 e11 跳转到 e14 然后停留在那里的原因。它准确地显示了字符串的字符。

标签: python matplotlib


【解决方案1】:

假设您的 x 值是浮点数(不是字符串),请尝试将以下内容添加到您的代码中:

import matplotlib.ticker as mtick
axes.xaxis.set_major_formatter(mtick.FormatStrFormatter('%.2e'))

【讨论】:

  • 修正了小数位,谢谢!但是,这将我的值四舍五入为 2 个有效数字。有没有办法保留小数点后 2 位的 3 位有效数字?
  • @lauchter 欢迎您。礼仪是在寻求更多帮助之前接受并赞成答案。 stackoverflow.com/help/someone-answers
猜你喜欢
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
相关资源
最近更新 更多