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.
Table des matières
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 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 :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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=(nargin–1)/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 |
Les arguments de la fonction sont donc :
- le nom du fichier texte (ou chemin vers le fichier)
- Nom de la première variable à enregistrer
- Nom de la colonne correspondant à cette première variable
- Nom de la deuxième variable
- 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.