Hallo zusammen, Ich spiele gerade mit folgendem pgfplots Beispiel. Testweise möchte ich, dass das erste Balken-Set (none, rrn fb, wfs), basierend auf den Daten für size=0 (input siehe unten) als Durchschnitt der Werte angezeigt wird: (300000+400000+500000)/3=400000. Jedoch zeigt mir pgfplots alle 3 Balken für die drei Werte 300000, 400000, 500000 separat und überlagert an. Gibt es einen simplen Befehl - zB. als Option für Hier der TeX-Code, Eingabedatei via Open in Online-Editor
\documentclass[12pt]{article} \usepackage[english]{babel} \usepackage[utf8x]{inputenc} \usepackage{amsmath} \usepackage{tikz} \usepackage{filecontents} \begin{filecontents}{06_mi_mm_tp-comparison.txt} size none rr fb wfs 0 300000 300000 300000 300000 0 400000 400000 400000 400000 0 500000 500000 500000 500000 1 605292 1521765 1629664 1750771 2 294844 1154284 1118936 1566752 3 0 0 0 0 \end{filecontents} \usepackage{pgfplots} \usetikzlibrary{shapes,chains,positioning,shadows} \pgfplotsset{compat=1.7} \usepgfplotslibrary{groupplots} \begin{document} \pgfplotstableread {06_mi_mm_tp-comparison.txt} {\loadedtable} \begin{figure}[!ht] \centering \begin{tikzpicture} \begin{axis}[ybar,%bar width=7pt, xlabel={UDP dtgr. size (Bytes)}, ylabel=Throughput (Mbit/s), grid=major, xtick=data, xticklabels = {250,500,1500,3000}, legend columns = 1, legend style={legend pos=outer north east},] %width=0.6\textwidth,] \addplot table[x=size, y=none] {\loadedtable}; \addplot table[x=size, y=rr] {\loadedtable}; \addplot table[x=size, y=fb] {\loadedtable}; \addplot table[x=size, y=wfs] {\loadedtable}; \legend{no mode,RR PS,Ext.RR PS,WFS PS} \end{axis} \end{tikzpicture} \caption{Throughput results of different packet scheduling modes} \label{fig:m-mm-tp-comp} \end{figure} \end{document} Die Ausgabe: Ich bin Anfänger mit pgfplots, und versuche den Code so einfach wie möglich zu halten. Ich freue mich über jeden Vorschlag. Danke. gefragt 29 Jan '15, 10:35 Christian_FFM stefan ♦♦ |
Man kann das sicher mit LuaTeX direkt bearbeiten, vielleicht bietet auch pgfplots jetzt oder irgendwann ein Feature. Was auf jeden Fall geht, ist das externe Aufbereiten der Daten. Das kann man auch innerhalb des LaTeX-Dokuments tun. In diesem Dokument ist ein perl-Script enthalten, dass gespeichert wird und mit den Eingabedaten ausgeführt wird und die Durchschnitte berechnet. Diese wiederum werden dann in die Tabelle eingelesen und grafisch ausgegeben. Ich habe die Eingabewerte etwas variiert, da im Original die betreffenden Spalten alle gleich sind, damit man mehr von der Wirkung sieht. Es läuft sogar im Online-LaTeX-Editor. Einfach draufklicken. Open in Online-Editor
\documentclass[12pt]{article} \usepackage[english]{babel} \usepackage[utf8x]{inputenc} \usepackage{amsmath} \usepackage{tikz} \usepackage{filecontents} \begin{filecontents*}{input.txt} size none rr fb wfs 0 300000 100000 100000 100000 0 400000 200000 400000 300000 0 500000 500000 500000 500000 1 605292 1521765 1629664 1750771 2 294844 1154284 1118936 1566752 3 0 0 0 0 \end{filecontents*} \begin{filecontents*}{calc.pl} #!/usr/bin/perl $header = <>; $, = ' '; print $header; $\ = "\n"; while (<>) { ($Spalte1,$Spalte2,$Spalte3,$Spalte4,$Spalte5) = split(' ', $_, -1); if (/^[0-9]/) { if ($Spalte1 ne $size && length($size) != 0) { print $size, $none / $n, $rr / $n, $fb / $n, $wfs / $n; $size = $Spalte1; $none = $Spalte2; $rr = $Spalte3; $fb = $Spalte4; $wfs = $Spalte5; $n = 1; } else { $size = $Spalte1; $none += $Spalte2; $rr += $Spalte3; $fb += $Spalte4; $wfs += $Spalte5; $n += 1; } } } print $size, $none / $n, $rr / $n, $fb / $n, $wfs / $n; \end{filecontents*} \immediate\write18{/usr/bin/perl calc.pl input.txt > output.txt} \usepackage{pgfplots} \usetikzlibrary{shapes,chains,positioning,shadows} \pgfplotsset{compat=1.7} \usepgfplotslibrary{groupplots} \begin{document} \pgfplotstableread {output.txt} {\loadedtable} \begin{figure}[!ht] \centering \begin{tikzpicture} \begin{axis}[ybar,%bar width=7pt, xlabel={UDP dtgr. size (Bytes)}, ylabel=Throughput (Mbit/s), grid=major, xtick=data, xticklabels = {250,500,1500,3000}, legend columns = 1, legend style={legend pos=outer north east},] %width=0.6\textwidth,] \addplot table[x=size, y=none] {\loadedtable}; \addplot table[x=size, y=rr] {\loadedtable}; \addplot table[x=size, y=fb] {\loadedtable}; \addplot table[x=size, y=wfs] {\loadedtable}; \legend{no mode,RR PS,Ext.RR PS,WFS PS} \end{axis} \end{tikzpicture} \caption{Throughput results of different packet scheduling modes} \label{fig:m-mm-tp-comp} \end{figure} \end{document} Lokal, ohne Online-Editor, benötigt man Perl, das ist bei Linux dabei, Mac OS X vmtl. auch, unter Windows gibt es Active State Perl frei, sonst gehen natürlich auch andere Programmiersprachen. Und es muss beantwortet 29 Jan '15, 21:15 stefan ♦♦ Hallo Stefan, vielen vielen Dank für deine Mühen! Habe es im Online Editor probiert, sieht gut aus. Ich probiere es mal lokal unter Windows zum Laufen zu bekommen, mit shell-escape. Ich muss mal sehen, wie das Äquivalent zu folgender Zeile unter Windows aussieht: immediatewrite18{/usr/bin/perl calc.pl input.txt > output.txt}
(30 Jan '15, 09:06)
Christian_FFM
@Christian_FFM Ja, war gar nicht so einfach. Kannst Dich mit einigen interessanten Fragen zu TikZ und pgfplots revanchieren ;-) vielleicht versuche
(30 Jan '15, 09:31)
stefan ♦♦
|