WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Daten in Form von Tabellen und Plots als PDF exportieren

 

Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 05.11.2011, 05:41     Titel: Daten in Form von Tabellen und Plots als PDF exportieren
  Antworten mit Zitat      
Hey Matlab-Freunde,

ich habe des öfteren im Forum gelesen, dass sich so ein mancher mit dem exportieren von Daten bzw. Figures mit den entsprechenden Daten in ein gängiges Format wie pdf schwer tut. Durchaus ist mir keine gängige Methode, wie z.B. in Java bekannt, soetwas in gescheiter Qualität mit den uicontrols bzw. uitables etc. zu verwirklichen (vll kennt ja der ein oder andere doch eine Möglichkeit?!). Meist sieht das Ergebnis unscharf aus und dabei möchte man es ja nicht belassen.

Im Prinzip kann man mit ein bißchen Aufwand mittels axes-, line - und text - Objekten viel verwirklichen. Voraussetzung dafür ist, dass man diese mühsam positioniert. Der Vorteil ist aber, dass man alles wie man möchte Mischen kann und dadurch recht flexibel ist. Soll heißen Plots, Textpassagen, Tabellen etc. sind so in gescheiter Qualität erstellbar. Auch die Erstellung von mehrseitigen pdfs ist möglich. Allerdings nicht ohne vorher eine bereits nützliche Funktion (ps2pdf) vom MFE herunterzuladen (darauf gehe ich jetzt aber nicht näher ein, denn das ist recht gut in der Funktion vom MFE erklärt).

Der im Folgenden aufgeführte Quellcode führt jetzt nicht zu einem Designpreis, allerdings ist zu erkennen, dass eine übersichtliche Gestaltung mit relativ wenig Aufwand möglich ist.

Was ich nicht mit reingenommen habe, da dies ja nur ein Beispiel ist, sind Kopf- Und Fußzeilen, die man auch einfach mit den oben genannten Objekten erstellen und platzieren kann. Beispielsweise kann man als Kopfzeile ein Firmenlogo (z.B. jpg) oder what ever in eine dafür vorgesehene axes im oberen figure Bereich einfügen.

Auf jeden Fall sollte man während der Erstellung einer zu exportierenden figure das Property Visible auf on stellen, damit man auch sieht wo die ganzen Objekte landen, die man mittels Koordinaten platziert. Wenn man dann fertig ist kann man diese auf off stellen damit der User nicht sieht was da passiert.

So hier der Quellcode:
Code:

function PlotPDF
% Datenerzeugung
data_double = rand(10,9)*100;% Messdaten
data_table1 = cellfun(@(x)sprintf('%.1f',x),num2cell(data_double),'UniformOutput',0);% Messdaten
data_names = cellfun(@(x)sprintf('M %.0f [dB(A)]',x),num2cell(1:10),'UniformOutput',0);% Namen der Messungen
table_header = {'Frequenz' '31,5' '63' '125' '250' '500' '1k' '2k' '4k' '8k'};% Table Header

% Erstellen der ersten grafischen Objekte
h1 = figure(...
    'Units','centimeters',...
    'PaperUnits','centimeters',...
    'PaperSize',[21 29.7],...
    'Color',[1 1 1],...
    'PaperPosition',[0 0 21 29.7],...
    'IntegerHandle','off',...
    'MenuBar','none',...
    'Name','Plot',...
    'NumberTitle','off',...
    'Position',[0 0 21 29.7],...
    'Resize','off',...
    'Visible','off',...
    'PaperType','A4',...
    'Tag','fig_plot');

TableAxes = axes(...
    'Parent',h1,...
    'Units','centimeters',...
    'Position',[3 20 15 8],...
    'visible','off',...
    'box','off',...
    'Tag','axes_table',...
    'XLim',[0 1],...
    'YLim',[0 1.1]);


% Schrifteigenschaften
font_art = 'Arial';
font_size = 10;
font_size2 = 8;

% Überschrift
text(0,1.1,'Messergebnisse','Color','k','Parent',TableAxes,'FontName',font_art,'FontSize',18,'FontWeight','bold');
% Datum
text(.88,1.1,date,'Color','k','Parent',TableAxes,'FontName',font_art,'FontSize',font_size2);

% Table Header
text(0,.9,table_header{1},'Color','b','Parent',TableAxes,'FontName',font_art,'FontSize',font_size);
x = [2:10]*.1;% x-Koordinaten
y= ones(1,9)*.9;% y-Koordinaten
text(x,y,table_header(2:end),'Color','b','Parent',TableAxes,'FontName',font_art,'FontSize',font_size,'HorizontalAlignment','right');

line([0 1],[.87 .87],'Parent',TableAxes,'Color','k')
line([0 1],[.86 .86],'Parent',TableAxes,'Color','k')

% Namen der Messungen
x = zeros(1,10);% x-Koordinaten
y= [9:-1:0]*.09;% y-Koordinaten
text(x,y,data_names,'Color','k','Parent',TableAxes,'FontName',font_art,'FontSize',font_size2,'FontWeight','bold');

% Messdaten
x = bsxfun(@times,ones(10,9),[2:10].*.1);% x-Koordinaten
y = bsxfun(@times,ones(10,9),[9:-1:0]'.*.09);% y-Koordinaten
for n=1:10
    text(x(n,:),y(n,:),data_table1(n,:),'Color','k','Parent',TableAxes,'FontName',font_art,'FontSize',font_size2,'HorizontalAlignment','right');
end


% Linien einzeichnen
x = [zeros(9,1) ones(9,1)];% x-Koordinaten
y = [[1:9]'*.09-.05 [1:9]'*.09-.05];% y-Koordinaten
for n=1:9
    line(x(n,:),y(n,:),'Parent',TableAxes,'Color','k')
end

% 1. Axes für plot
Plot1Axes = axes(...
    'Parent',h1,...
    'Units','centimeters',...
    'Position',[4 11.5 14 7],...
    'visible','on',...
    'box','on',...
    'Tag','axes_plot1');

plot(data_double(1:5,:),'Parent',Plot1Axes);% daten plotten
% Plot anpassen
set(Plot1Axes,'XTickLabel',{'31,5' '63' '125' '250' '500' '1k' '2k' '4k' '8k'})
xlabel('Frequenz [Hz]','Parent',Plot1Axes)
ylabel('Leq [dB]','Parent',Plot1Axes)
legend(data_names(1:5))
grid('on')

% 2. Axes für bar
Plot2Axes = axes(...
    'Parent',h1,...
    'Units','centimeters',...
    'Position',[4 2.5 14 7],...
    'visible','on',...
    'box','on',...
    'Tag','axes_plot1');

bar(data_double(1:5,:)','group','Parent',Plot2Axes);% daten plotten
% Plot anpassen
set(Plot2Axes,'XTickLabel',{'31,5' '63' '125' '250' '500' '1k' '2k' '4k' '8k'})
xlabel('Frequenz [Hz]','Parent',Plot2Axes)
ylabel('Leq [dB]','Parent',Plot2Axes)
legend(data_names(6:10))
colormap('winter')
grid('on')

try % wenn Acrobat installiert ist
    print(h1, '-dpdf', '-r300', 'test.pdf');
    winopen('test.pdf')
catch %#ok sonst wird der matlab printpreview geöffnet (der alles andere als komfortabel ist)
    uiwait(printpreview(h1))
end
delete(h1)
end
 

Auch eine Art row stripping bei der Tabelle ist möglich indem man einfach die Textobjekte von geraden und ungeraden Zeilen in unterschiedlichen Farben erstellt.

Wenn man sich ein bißchen mehr mühe bei der Gestaltung gibt wie ich in diesem Fall, kann man ganz ansehnliche Dokumente erstellen.

Ich hoffe dies hilft dem einen oder anderen weiter...

Anbei ist noch der Quellcode als m-File...

Greetings

Marco

PlotPDF.m
 Beschreibung:

Download
 Dateiname:  PlotPDF.m
 Dateigröße:  3.68 KB
 Heruntergeladen:  1232 mal
Private Nachricht senden Benutzer-Profile anzeigen


EccoBravo
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 12.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2011, 18:30     Titel:
  Antworten mit Zitat      
ja, prima und Dank Marko H. ,

so etwas habe ich schon lange gesucht, nachdem ich mir mit dem MatLab Report Generator die Zähne ausgebissen hatte.

Nun brauche ich schnell nochmal Deine Hilfe (denn ich bin ein amateurhafter Anfänger).

Dieses mitgelieferte Programm werde ich nun als function in mein GUI-Programm hineinkopieren.
Frage 1:
Wie kriege ich nun den Inhalt meines GUI-Axes "ax_Bild" mit samt allen Kurven und Formatierungen in Deine PDF-Function?
Frage 2:
Wie bekomme ich eine zweidimensionale Matrix "mat_result" (10 Zeilen, 3 Spalten) aus meinem GUI-Programm in Deine PDF-Function ?

Vielen Dank und Lob

EB
_________________

Ich habe mich nicht mit Ruhm bekleckert, dafür aber andere.
Meine Hobbies,
bunt zuschauen und rhytmisch zuhören!
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 10.11.2011, 20:15     Titel:
  Antworten mit Zitat      
Hey,

indem du einfach deine Daten und axes mit übergibst wie bei allen Funktionen.
Code:

function PlotPDF (ax_Bild,mat_result)
% hier daten verarbeiten und pdf erstellen...
end

% und Funktionsaufruf in deinem Callback
PlotPDF (ax_Bild,mat_result);
 


mittels copyobj kannst du dann deine axes 1 zu 1 in die Figure kopieren, aus der eine pdf werden soll (in meinem Fall h1). Natürlich müsstest du dann schauen wie du diese am besten auf die figute platzierst d.h. die Position müsstest du natürlich noch anpassen und ggf auch die Units damit es einheitlich wird und du besser beurteilen kannst wie groß der Seitenrand o.ä. sein soll.

Greetings

Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
EccoBravo
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 12.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2011, 22:10     Titel:
  Antworten mit Zitat      
Markus HL. vielen Dank ich werde es probieren, falls ich Probleme bekomme, können wie dieses per pn lösen?

Danke und ein schönes WE

EB
_________________

Ich habe mich nicht mit Ruhm bekleckert, dafür aber andere.
Meine Hobbies,
bunt zuschauen und rhytmisch zuhören!
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 19.11.2011, 16:24     Titel:
  Antworten mit Zitat      
Hey,

klar kannst du mich via pn anschreiben. Nur wenn es anderen vll auch weiter helfen würde, könntest du auch hier fragen...

Greetings
Private Nachricht senden Benutzer-Profile anzeigen
 
EccoBravo
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 12.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2011, 16:47     Titel: den A4-Ausdruck im Querformat
  Antworten mit Zitat      
Hallo Marco H,

habe Deinen Code ausprobiert, nicht schlecht, aber ich bin auf ein paar Probleme gestoßen
Mein Hauptproblem:
Wie kann ich ein A4 ... im Querformat erzeugen und ausdrucken?

Mein zweites Problem:
Wie weiß Matlab, dass
mit der 1. Zeile ..bsxfun(..) eine OneMatrix spaltenweise und
mit der 2. Zeile ..bsxfun(..) eine OneMatrix zeilenweise multipliziert werden soll?


Mein drittes Problem:
Was ist uin Deinem Code jeweils der Index für Tabellenspalte und Tabellenzeile?

Ich komme aus der Delphiecke, dort sind Zeilen- und Spaltenindes umgedreht deshalb komme ich bei Matlab immer total durcheinander.
Vielen Dank

EB
_________________

Ich habe mich nicht mit Ruhm bekleckert, dafür aber andere.
Meine Hobbies,
bunt zuschauen und rhytmisch zuhören!
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 21.11.2011, 17:39     Titel:
  Antworten mit Zitat      
Hey,

zu 1.: siehe doc figure (Position anpassen und PaperOrientation auf landscape)
zu 2.: siehe doc bsxfun (Matrix A und Matrix B müssen entweder gleiche Dimensionen haben bzw. Spalte oder Zeilenanzahl muss 1 sein)
zu 3.: n ist der Zeilenindex. d(row,column). Auch dies ist in der Hilfe beschrieben...

Setz doch einfach mal die figure auf visible on und debugge eine for schleife, dann siehst du genau was da vor sich geht.

Greetings Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
EccoBravo
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 12.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.11.2011, 13:06     Titel: PDF-Printout mit Seitenwechsel
  Antworten mit Zitat      
Hallo Marco H,

jetzt komme ich voraussichtlich mit meiner letzten Frage,
Deinen PDF-Printout mit Bild und Tabelle habe ich nun hinbekommen.

Wie kann ich mehrseitige Ausdrucke machen ?
Seitenwechsel und Co.?

Vielen Dank

EB
_________________

Ich habe mich nicht mit Ruhm bekleckert, dafür aber andere.
Meine Hobbies,
bunt zuschauen und rhytmisch zuhören!
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 22.11.2011, 14:43     Titel:
  Antworten mit Zitat      
Hey,
Zitat:

Deinen PDF-Printout mit Bild und Tabelle habe ich nun hinbekommen

das ist doch schonmal gut Wink .

Zitat:

Wie kann ich mehrseitige Ausdrucke machen ?
Seitenwechsel und Co.?

Wie in meinem Tutorial erwähnt gibt es dafür auf dem MFE ein m-File welches dir viel Arbeit abnimmt -> http://www.mathworks.com/matlabcentral/fileexchange/19516-ps2pdf

Du musst für jede zu erstellende Seite eine figure erstellen, wie du es ja jetzt mit deiner einen Seite gemacht hast (also z.B. mit einer Schleife). Dann kannst du diese mittels print als postscript Datei speichern. Hierbei gibt es den Befehl append (doc print) z.B.
Code:

print(h(m),'-dpsc','-append','-r300',sprintf('%s.ps',filename));
 

Wenn du alle figures "geprintet" hast kannst du mittels ps2pdf die ps Datei in eine pdf- Datei umwandeln. Dabei musst du allerdings darauf achten was für eine Matlab Version du hast (32, 64 Bit oder soll es kompiliert werden) (ist aber auch in der ps2pdf Datei beschrieben, denn du müsstest ggf. ghostscript installieren).
Greetings

Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.