Export de données Matlab pour PGFPlots

Nombreuses sont les personnes m’ayant demandé comment mettre en forme facilement des données MATLAB pour tracer ces données avec TikZ/PGFplots. Je vais donc vous proposer deux façons de faire : une simple mais spécifique à chaque cas, et une autre plus complexe mais beaucoup plus flexible.

Code (vraiment) minimal

Supposons que nous voulions enregistrer les vecteurs x, y1 et y2 dans le fichier “resultat.txt”, et ajouter pour chacun d’eux un nom de colonne : “abs”, “data_exp”, “data_simu” respectivement. Le code suivant fera parfaitement l’affaire :

M=[x,y1,y2];	 % Les vecteurs doivent être en colonne
filename='resultat.txt';
 
fileID = fopen(filename,'w');	% Enregistrement de l'entête
	 fprintf(fileID,'%s\t%s\t%s\n','abs','data_exp','data_simu');
fclose(fileID);
 
dlmwrite('filename',M,'-append','delimiter','\t')	% Ajout à la fin du fichier

Par la suite, vous pourrez ainsi tracer vos courbes dans \LaTeX en faisant simplement appel au fichier et aux colonnes qui vont bien. Ex :

\begin{tikzpicture}
	 \begin{axis}
		\addplot+[mark=none] table[x=abs, y=data_exp] {resultat.txt};
		\addplot+[mark=none] table[x=abs, y=data_simu] {resultat.txt};
	\end{axis}
\end{tikzpicture}

Pour rappel, voir ici pour plus de détails sur PGFPlots.

Utilisation d’un fonction

Si on veut rendre le code plus flexible, c’est-à-dire extensible à autant de variables que souhaité, et mettre ça sous forme de fonction, voici une solution possible :

function exportPGFPlots( filename, varargin )
 %Exporte les données au format ASCII, sous forme de colonnes avec un nom
 %propre à chaque colonne, pour PGFPlots.
 % exportPGFPlots('FICHIER', VAR1, 'NOM1', VAR2, 'NOM2', …) enregistre
 % les vecteurs VAR1, VAR2,.. dans le fichier FICHIER. Le fichier
 % comporte en entête le nom des colonnes (NOM1, NOM2 etc.).
nbcol=(nargin1)/2 ;  % Nombre de colonnes dans le fichier
if ~mod(nbcol,1) == 0  % Si nbcol n'est pas un entier
error('Nombre de paramètres incohérent.')
end
M=zeros(max(size(varargin{1})),nbcol) ;  % Matrice de données
fileID = fopen(filename,'w') ;
for i=1 :nbcol
 % % Mise en forme de la matrice des données
varId= 2*i-1 ;
v= varargin{varId} ;
if size(v( :),1)~=size(M,1)
error('Les vecteurs à enregistrer doivent être de même dimension.')
end
M( :,i)= v( :) ;  % Force le vecteur à être en colonne
 % % Mise en forme de l'entête (noms des colonnes)
strId= 2*i ;
if ~ischar(varargin{strId})
error('Les noms des colonnes doivent être de type STRING.')
end
fprintf(fileID,' %s\t',varargin{strId}) ;
end
fprintf(fileID,'\n') ;  % Ajout d'un retour chariot à la fin de l'entête
fclose(fileID) ;
dlmwrite(filename,M,'-append','delimiter','\t')
end

view raw
exportPGFPlots.m
hosted with ❤ by GitHub

Les arguments de la fonction sont donc :

  1. le nom du fichier texte (ou chemin vers le fichier)
  2. Nom de la première variable à enregistrer
  3. Nom de la colonne correspondant à cette première variable
  4. Nom de la deuxième variable
  5. Nom de la colonne correspondant à cette seconde variable
    etc.

Pour obtenir le même résultat que précédemment, il suffit alors d’exécuter la commande suivante :

exportPGFPlots('resultat.txt',x,'abs',y1,'data_exp',y2,'data_simu')

Pour aller plus loin

Si vous êtes un fou furieux des graphiques de MATLAB, mais que vous voulez tout de même les rendre “TikZ friendly”, peut-être serez-vous intéressé par Matlab2tikz.