将数字显示为 (10^3)^n 的倍数(数字格式)

问题描述 投票:0回答:1

我有一个 numpy 数据数组。这些数据就是张力。所以我希望它们的单位是千伏

(10^3)^1
、伏特
(10^3)^0
、毫伏
(10^3)^-1
、微伏
(10^3)^-2

在 Excel 中,我曾经将数字格式化为自定义格式,

"##0,0E+0"
,但我不想再使用 Excel。

我尝试用Python来做到这一点:

plt.ticklabel_format(axis = 'y', style = 'sci', scilimits = (0,0)) 

使用 matplotlib。 但有时它会显示

10^(-5)
10^(-4)
的倍数之类的数字。我希望它显示这些数字,例如
10*10(-6)
100*10^(-6)

这是完整的代码:

import numpy as np
from matplotlib import pyplot as plt
import csv 
import pandas as pd
from scipy import fftpack
import os
from pathlib import Path



def slice_temps(donnees, temps_debut, temps_fin): 
    """
    

    Parameters
    ----------
    donnees : numpy array
        Les donnees dont on veut seulement une partie du temps 
    temps_debut : float
        La borne inférieur de la partie du temps qu'on veut 
    temps_fin : float
        La borne supérieur de la partie du temps qu'on veut 

    Returns
    -------
    numpy array
        Les donnees mais seulement sur une partie du temps. (Il y a toutes les données (phase, 1F, courant...etc))

    """
    if temps_debut < donnees[0,3] or temps_fin > donnees[len(donnees[:,3])-1,3] or temps_debut > temps_fin :
        print("Slice : Les bornes indiquees ne sont pas bonnes. Le temps est comrpis entre (", donnees[0,3],  ",", donnees[len(donnees[:,3])-1,3], ") s")
        return np.empty(np.shape(donnees))
    else : 
        i_temps_debut, = np.where(np.isclose(donnees[:,3], temps_debut))
        i_temps_fin, = np.where(np.isclose(donnees[:,3], temps_fin))
        return donnees[i_temps_debut[0]:i_temps_fin[0],:]
    
    


def suppression_temps(donnees, temps_debut_suppression, temps_fin_suppression):
    """
    Permets de supprimer les données entre deux temps. Cette fonction renvoie un numpy array sans la partie non désirée. 

    Parameters
    ----------
    donnees : TYPE
        DESCRIPTION.
    temps_debut_suppression : TYPE
        DESCRIPTION.
    temps_fin_suppression : TYPE
        DESCRIPTION.

    Returns
    -------
    TYPE
        DESCRIPTION.

    """
    if temps_debut_suppression < donnees[0,3] or temps_fin_suppression > donnees[len(donnees[:,3])-1,3] or temps_debut_suppression > temps_fin_suppression :
        print("Suppression : Les bornes indiquees ne sont pas bonnes. Le temps est comrpis entre (", donnees[0,3],  ",", donnees[len(donnees[:,3])-1,3], ") s")
        return np.empty(np.shape(donnees))
    else :
        i_temps_debut_suppression, = np.where(np.isclose(donnees[:,3], temps_debut_suppression))
        i_temps_fin_suppression, = np.where(np.isclose(donnees[:,3], temps_fin_suppression))
        
        premiere_partie = donnees[:i_temps_debut_suppression[0],:]
        seconde_partie = donnees[i_temps_fin_suppression[0]:,:]
        return np.concatenate((premiere_partie , seconde_partie))







#Changer simplement le path avec celui du fichier souhaité ici : 

windows_path = r"H:\2024_02_09\2024_02_09_ScanTime_ALN-2035_29deg_0mA_mod9800Htz35mA-LaserOFF-VentilateurOFF.csv"
universal_path = Path(windows_path)


data = pd.read_csv(universal_path , sep = ';'  , skiprows = 1,  encoding = 'ISO-8859-1', engine = 'python' ) 
data.head()
donnees = np.char.replace(data.to_numpy(dtype = str), ',', '.').astype(float)

#  data.to_numpy(dtype = str) transforme pandas.dataframe en numpy.array
#  np.char.replace(, ',', '.') remplace virgules par des points dans les strings
#  .astype(float) convertie les strings en float



plt.figure(figsize = (8,8))
plt.grid()
plt.gca().set_yticklabels(['{:,.0f}'.format(x*1e6)  + "*10(-6)" for x in plt.gca().get_yticks()])
plt.scatter(donnees[:,3], donnees[:,7], s = 1)
plt.xlabel("Temps(s)")
plt.ylabel("Signal microphones (V)")
plt.title("Signal du microphone laser ON et ventilateur ON. \n Le laser est sur un pic de signal ( 0.566A ) et son intensité est constante.\n Laser à 29°C, aucun débit.\n Temps de pose de 8 minutes ")
plt.show()

#%%
#Selection en temps et calcul de moyenne / ecart-type


donnees_slice = slice_temps(donnees, 40468, 41041 )


plt.figure(figsize = (8,8))
plt.grid()
plt.gca().set_yticklabels(['{:,.0f}'.format(x*1e6)  + "*10(-6)" for x in plt.gca().get_yticks()])
plt.scatter(donnees_slice[:,3], donnees_slice[:,7])
plt.xlabel("Temps(s)")
plt.ylabel("Signal microphones (V)")
plt.title(f'Signal du microphone laser OFF et ventilateur OFF. \n Le laser est sur un pic de signal ( 0.566A ) et son intensité est constante.\n Laser à 29°C, aucun débit. Temps de pose de 9 minutes \n Moyenne = {np.mean(donnees_slice[:,6])} Ecart-type = {np.std(donnees_slice[:,6])} \n RSB = {np.mean(donnees_slice[:,6]) / np.std(donnees_slice[:,6])}')
plt.show()

#%% On supprime les bruits trop importants(exemple : quelqu'un parle pendant l'acquisition de données, bruit de porte ...etc)


supr_1 = suppression_temps(donnees, 40529, 40568)
supr_2 = suppression_temps(supr_1, 40738, 40807)


plt.figure(figsize = (8,8))
plt.grid()
plt.gca().set_yticklabels(['{:,.0f}'.format(x*1e6)  + "*10(-6)" for x in plt.gca().get_yticks()])
plt.scatter(supr_2[:,3], supr_2[:,7])
plt.xlabel("Temps(s)")
plt.ylabel("Signal microphones (V)")
plt.title(f'Signal du microphone laser OFF et ventilateur OFF. \n Le laser est sur un pic de signal ( 0.566A ) et son intensité est constante.\n Laser à 29°C, aucun débit. Temps de pose de 9 minutes \n Moyenne = {np.mean(supr_2[:,6])} Ecart-type = {np.std(supr_2[:,6])} \n RSB = {np.mean(supr_2[:,6]) / np.std(supr_2[:,6])}')
plt.show()

我该怎么做?

python matplotlib format numbers
1个回答
0
投票
plt.gca().set_yticklabels(['{:,.0f}'.format(x*1e6)  + "*10(-6)" for x in plt.gca().get_yticks()])

在我的用户 JohanC 建议 FuncFormatter 之后我决定添加第二个解决方案

导入后:

from matplotlib.ticker import FuncFormatter

您还可以使用:

plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda x, pos: "{:,.0f}*10(-6)".format(x * 1e6)))

我认为这个版本更难,但你可以在这两个链接中了解有关 FuncFormatter 的更多信息:

https://matplotlib.org/stable/api/ticker_api.html#matplotlib.ticker.FuncFormatter

&

https://github.com/matplotlib/matplotlib/blob/v3.8.2/lib/matplotlib/ticker.py#L304-L329

© www.soinside.com 2019 - 2024. All rights reserved.