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 \addplot table - um den Durchschnittswert zu bilden?

Hier der TeX-Code, Eingabedatei via filecontents-Umgebung eingebettet:

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:

Plot

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's gravatar image

Christian_FFM
21113
Akzeptiert-Rate: 0%

bearbeitet 29 Jan '15, 11:14

stefan's gravatar image

stefan ♦♦
18.3k163148


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 write18 aka shell-escape für den TeX-Übersetzungsvorgang aktiviert sein, damit das externe Script ausgeführt wird.

Permanenter link

beantwortet 29 Jan '15, 21:15

stefan's gravatar image

stefan ♦♦
18.3k163148
Akzeptiert-Rate: 49%

bearbeitet 29 Jan '15, 21:18

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 \immediatewrite18{c:/texlive/2014/tlpkg/tlperl/perl.exe calc.pl input.txt > output.txt} wenn es TeX Live 2014 ist, sonst suche perl.exe. Statt des minimalen inkludierten Perl kriegst Du ein vollwertiges unter www.activestate.com - der Pfad ist dann vllt. c:/bin/perl.exeoder je nach Installationsort. awk oder gawk geht auch als alternatives Scriptprogramm. Mit Lua habe ich es noch nicht versucht.

(30 Jan '15, 09:31) stefan ♦♦
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×298
×54
×3

gestellte Frage: 29 Jan '15, 10:35

Frage wurde gesehen: 11,498 Mal

zuletzt geändert: 30 Jan '15, 09:31