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
Code, hier editierbar zum Übersetzen:
\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};
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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.4k163148


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
Code, hier editierbar zum Übersetzen:
\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;
}
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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.4k163148
Akzeptiert-Rate: 50%

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 ausblenden]

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

Frage-Themen:

×298
×54
×3

gestellte Frage: 29 Jan '15, 10:35

Frage wurde gesehen: 11,819 Mal

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