我有一个 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()
我该怎么做?
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