PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bubble Chart mit PGFplots



romanrt
17-02-2012, 21:44
Hallo zusammen,

ich möchte ein "Bubblechart" erstellen mit drei (weiteren) Dimensionen, neben der Blasengröße welche ja eigentlich als vierte Dimension gezählt werden sollte.

Ist das möglich?

Die Achsen sollten jeweils im 120° Winkel zu einander stehen (also so wie der Stern eines süddt. Automobilherstellers). Die Bubbles repräsentieren Firmen, denen jeweils vier Werte zugeordnet sind. Der vierte Wert gibt die Größe der Blase an. Die Werte 1-3 (Relativwerte, also in Prozent) bestimmen die Lage im Koordinatensystem.

Eigentlich ganz einfach von Hand zu zeichnen, aber gibt es denn theoretisch überhaupt die Möglichkeit sowas in PDFLatex erstellen zu lassen.

Grüße

Roman

Feuersaenger
18-02-2012, 11:02
Hallo romanrt,

von Haus aus unterstuetzt pgpfplots bubble charts der folgenden typen:

- position (2d) + farbe (vgl. scatter plot von pgfplots)

- position (2d) + farbe + marker groesse (siehe 'visualization depends on' und das beispiel darin)

- position (2d) + farbe + marker typ / marker groesse / marker style / whatever (geht ebenfalls alles mit 'visualization depends on')

Dasselbe wie oben geht auch mit 3d positionen - dann aber in einem der standard-kartesischen koordinatensystemen von pgfplots. Man kann mit 'x={(1cm,0cm)}, y={(...,...)}, z={(...,...)}' auch angeben, in welche richtung denn die achsen gehen sollen.

Du kannst ja mal damit rumexperimentieren. Bei konkreten Fragen kannst Du ja nochmal spezifischere Fragen stellen.

Fuer das 'visualization depends on' feature bietet sich die Eingabe von Daten in tabellen an - jede zusatzdimension waere dann einfach eine weitere spalte in der Tabelle.

Mit liebem Gruss

Christian

romanrt
20-02-2012, 12:58
Hallo Christian,

erst einmal vielen Dank für den Support.

Ich habe jetzt ein Beispiel erstellt, welches allerdings noch nicht all die tollen Features implementiert hat von welchen ich sprach.

Momentan fehlt mir noch

die Syntax wie ich aus meiner vierten Tabellenspalte die Größe der Marker bestimmen kann,
ein Weg wie ich das Layout des Koordinatensystems beeinflussen kann (dabei wäre mir schon geholfen, wenn ich die Linien "außenrum" wegbekommen würde).
der ultimative Weg die Marker zu beschriften. Die Beschriftung ist in der ersten Spalte meiner Tabelle hinterlegt.


Anbei mein Beispiel. Ich wäre für ein paar Tipps äußerst dankbar.

Grüße

Roman


Beispiel:



\documentclass[]{scrartcl}

\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{booktabs}
\usepackage{array}
\usepackage{colortbl}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\usetikzlibrary{patterns}
\usetikzlibrary{plotmarks}
\usetikzlibrary{fit}
\pgfplotsset{compat=newest}

\newcount\kencounter
\global\kencounter=0

\pgfplotsset{
dynamic dict/.style={
x coord trafo/.code={%
%\pgfkeysifdefined{/ken/key ##1}{%
% re-use existing key.
% \pgfkeysgetvalue{/ken/key ##1}\pgfmathresult%
%}{%
% dynamically define a new key with integer value of
% \kencounter:
\edef\pgfmathresult{\the\kencounter}%
% this is the new key:
\global\pgfkeyslet{/ken/key ##1}\pgfmathresult
% remember inverse for the inverse trafo:
\global\pgfkeyslet{/ken/key no \pgfmathresult}{##1}%
\global\advance\kencounter by 1
% NOTE: \global makes the following definition in GLOBAL
% namespace.
%}%
},
x coord inv trafo/.code={%
% truncate 0.0 -> 0; 1.5 --> 1
\pgfmathint{##1}%
% lookup inverse!
\pgfkeysifdefined{/ken/key no \pgfmathresult}{%
\pgfkeysgetvalue{/ken/key no \pgfmathresult}\pgfmathresult%
}{%
\PackageError{pgfplots}{Inverse trafo for \pgfmathresult\space failed: no such key!}{}%
}%
},
xticklabel={\tick},
scaled x ticks=false,
plot coordinates/math parser=false,
xticklabel style={rotate=45,anchor=east},
xtick=data,
},
}

\usepackage{filecontents}
\begin{filecontents}{nvivo.csv}
%Name; Eco ; Env ; Soc
Avon - 2011;35.85;22.64;41.51;0.06
BBC - 2010;9.52;66.67;23.81;0.03
Bertelsmann - 2011;13.79;40.23;45.98;0.02
British Airways - 2011;7.69;90.38;1.92;0.04
Chevron - 2010;44.93;24.64;30.43;0.04
Coca-Cola Enterprises - 2010;17.95;46.15;35.90;0.10
Danske Bank Group - 2011;16.87;54.22;28.92;0.02
Dell - 2011;6.49;35.06;58.44;0.11
Freshfields Bruckhaus Deringer - 2011;15.94;37.68;46.38;0.02
GlaxoSmithKline - 2010;17.59;67.59;14.81;0.11
Henry Davis York - 2011;18.75;62.50;18.75;0.01
IBM - 2010;24.24;33.33;42.42;0.17
Intel - 2010;40.88;29.41;29.71;0.27
Kelloggs - 2010;14.29;52.38;33.33;0.14
Nike - 2007 2008 2009;16.19;42.51;41.30;0.15
Novo Nordisk - 2011;24.83;16.11;59.06;0.02
RWE npower - 2010;15.38;46.15;38.46;
Sainsbury - 2011;31.17;45.45;23.38;
Siemens UK - 2010;15.79;57.89;26.32;0.09
Starbucks - 2010;36.84;21.05;42.11;0.04
Tesco - 2011;8.86;81.01;10.13;0.15
The Co-operative Group - 2010;18.75;9.56;71.69;0.05
\end{filecontents}


\begin{document}
\section*{Example}

\pgfplotstableread[col sep=semicolon]{nvivo.csv}\datatable
\pgfplotstableforeachcolumnelement{[index] 0}\of\datatable\as\cell{%
\cell,}

\begin{tikzpicture}
\begin{axis}[
xlabel={Economical},
ylabel={Environmental},
zlabel={Social},
title=Focus of CR Report]
\addplot3+[
only marks,
scatter,
x={(5cm,0cm)}, y={(0cm,-5cm)}, z={(8cm,-8cm)}
% visualization depends on={\thisrow index =4 \as \perpointmarksize}},
] table
[
x index =1,
y index =2,
z index =3,
]
from \datatable;
\end{axis}
\end{tikzpicture}

\end{document}

Feuersaenger
20-02-2012, 17:01
Hallo romanrt,

schau Dir mal das 'nodes near coords' Feature an - das sollte Punkt (3) beheben.

Zu Punkt (1): das makro ist glaube ich \thisrowno{4}, damit sollte Dein visualization depends on klappen.

Beachte aber: Spaltenindizes fangen bei 0 an. Es scheint, als ob Deine indizes alle einen zu gross seien... ?

Zu Punkt (2): wie gesagt, an sich unterstuetzt pgfplots nur standard kartesische Koordinatensysteme fuer 3d. Wenn man die mit Gewalt umbiegt, kommt vielleicht was sinnvolles raus - ich weiss es nicht. Versuchs mal mit 'axis lines=center', damit wirst Du die Box aussenrum los.

Mit liebem Gruss

Christian

romanrt
20-02-2012, 21:07
Hallo Christian,

wieder einmal vielen herzlichen Dank für die Unterstützung!

Ich bin jetzt ein gutes Stück voran gekommen - das Ergebnis "ähnelt" schon ein wenig dem Gewünschten.

Momentan habe ich noch folgende Schwierigkeiten (sicherlich eher Anfängerprobleme):

Meine Achsbeschriftungen haben sich relativ sinnfrei nach Nord-Ost verzogen.
Ich verstehe die nodes near coords Funktion so, dass nur die Koordinaten die tatsächlich verwendet wurden, angezeigt werden können. Ich wollte eigentlich die Beschriftung aus meiner Tabellenspalte "Name" dort haben. Ist das möglich (unter Beibehaltung der schönen Farben meiner Blasen)?
Kann ich die Größe der Marker irgendwie herunter skalieren?
Warum ist in meinem PDF eigentlich die erste Spalte meiner Tabelle gedruckt?


Code:



\documentclass[]{scrartcl}
\usepackage{pdflscape}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{booktabs}
\usepackage{array}
\usepackage{colortbl}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\usetikzlibrary{patterns}
\usetikzlibrary{plotmarks}
\usetikzlibrary{fit}
\pgfplotsset{compat=newest}

\newcount\kencounter
\global\kencounter=0


\usepackage{filecontents}
\begin{filecontents}{nvivo.csv}
Name;Eco;Env;Soc;Size
Avon - 2011;35.85;22.64;41.51;0.06
BBC - 2010;9.52;66.67;23.81;0.03
Bertelsmann - 2011;13.79;40.23;45.98;0.02
British Airways - 2011;7.69;90.38;1.92;0.04
Chevron - 2010;44.93;24.64;30.43;0.04
Coca-Cola Enterprises - 2010;17.95;46.15;35.90;0.10
Danske Bank Group - 2011;16.87;54.22;28.92;0.02
Dell - 2011;6.49;35.06;58.44;0.11
Freshfields Bruckhaus Deringer - 2011;15.94;37.68;46.38;0.02
GlaxoSmithKline - 2010;17.59;67.59;14.81;0.11
Henry Davis York - 2011;18.75;62.50;18.75;0.01
IBM - 2010;24.24;33.33;42.42;0.17
Intel - 2010;40.88;29.41;29.71;0.27
Kelloggs - 2010;14.29;52.38;33.33;0.14
Nike - 2007 2008 2009;16.19;42.51;41.30;0.15
Novo Nordisk - 2011;24.83;16.11;59.06;0.02
RWE npower - 2010;15.38;46.15;38.46;
Sainsbury - 2011;31.17;45.45;23.38;
Siemens UK - 2010;15.79;57.89;26.32;0.09
Starbucks - 2010;36.84;21.05;42.11;0.04
Tesco - 2011;8.86;81.01;10.13;0.15
The Co-operative Group - 2010;18.75;9.56;71.69;0.05
\end{filecontents}


\begin{document}



\begin{landscape}

\section*{Example}


\pgfplotstableread[col sep=semicolon]{nvivo.csv}\datatable
\pgfplotstableforeachcolumnelement{[index] 0}\of\datatable\as\cell{%
\cell,}

\begin{tikzpicture}
\begin{axis}[
width=1.33\textwidth,
xlabel={Economical},
ylabel={Environmental},
zlabel={Social},
title=Focus of CR Report,
axis lines=center,
% nodes near coords={(\thisrowno{0})},
axis on top,]
\addplot3+[
only marks,
scatter,
visualization depends on={\thisrowno{3} \as \perpointmarksize},
scatter/@pre marker code/.append style= {/tikz/mark size=\perpointmarksize}
] table
[
x={Eco},
y={Env},
z={Soc},
col sep=semicolon
]{nvivo.csv};
%from \datatable;
\end{axis}
\end{tikzpicture}

\end{landscape}


\end{document}


Viele Grüße

Roman

romanrt
21-02-2012, 17:35
Grundsätzlich immernoch die selben Probleme, aber die Darstellung ist schon etwas besser geworden.

Ich habe jedoch "gecheated" mit der Bubblesize Spalte.

Code:



\documentclass[]{scrartcl}
\usepackage{pdflscape}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{booktabs}
\usepackage{array}
\usepackage{colortbl}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\usetikzlibrary{patterns}
\usetikzlibrary{plotmarks}
\usetikzlibrary{fit}
\pgfplotsset{compat=newest}

\newcount\kencounter
\global\kencounter=0


\usepackage{filecontents}


\begin{filecontents}{crreports.csv}
Name;Eco;Env;Soc;Size
Avon - 2011;35.85;22.64;41.51;3.04
BBC - 2010;9.52;66.67;23.81;3.01
Bertelsmann - 2011;13.79;40.23;45.98;0
British Airways - 2011;7.69;90.38;1.92;3.04
Chevron - 2010;44.93;24.64;30.43;3.01
Coca-Cola Enterprises - 2010;17.95;46.15;35.90;3.06
Danske Bank Group - 2011;16.87;54.22;28.92;3.02
Dell - 2011;6.49;35.06;58.44;3.10
Freshfields Bruckhaus Deringer - 2011;15.94;37.68;46.38;3.01
GlaxoSmithKline - 2010;17.59;67.59;14.81;3.06
Henry Davis York - 2011;18.75;62.50;18.75;3.01
IBM - 2010;24.24;33.33;42.42;3.13
Intel - 2010;40.88;29.41;29.71;3.28
Kelloggs - 2010;14.29;52.38;33.33;3.09
Nike - 2007 2008 2009;16.19;42.51;41.30;3.12
Novo Nordisk - 2011;24.83;16.11;59.06;3.01
RWE npower - 2010;15.38;46.15;38.46;0
Sainsbury - 2011;31.17;45.45;23.38;3.04
Siemens UK - 2010;15.79;57.89;26.32;0
Starbucks - 2010;36.84;21.05;42.11;3.01
Tesco - 2011;8.86;81.01;10.13;3.11
The Co-operative Group - 2010;18.75;9.56;71.69;3.02
TEST ; 33.33 ; 33.33 ; 33.33 ; 15
% TEST ; 100 ; 0 ; 0 ; 15
% TEST ; 0 ; 100 ; 0 ; 15
% TEST ; 0 ; 0 ; 100 ; 15
\end{filecontents}




\begin{document}



\begin{landscape}


\begin{tikzpicture}
\begin{axis}[
view={45}{45},
width=1.40\textwidth,
xlabel={Economical},
ylabel={Environmental},
zlabel={Social},
title=Focus of CR Report,
% axis lines=center,
% nodes near coords={(\thisrowno{0})},
% axis on top,
grid=major,
z buffer=sort,
xmin=0,xmax=100,
ymin=0,ymax=100,
zmin=0,zmax=100,
enlargelimits=upper,
xtick={0,20,...,100},
ytick={0,20,...,100},
ztick={0,20,...,100},
title={Results from some CR Reports}]
\addplot3+[
only marks,
scatter,
visualization depends on={\thisrowno{4} \as \perpointmarksize},
scatter/@pre marker code/.append style= {/tikz/mark size=\perpointmarksize}
] table
[
x={Eco},
y={Env},
z={Soc},
col sep=semicolon
]{crreports.csv};
\addplot3[surf,mesh/rows=3] coordinates {
(100,0,0) (0,100,0) (0,0,100)
(0,100,0) (0,0,100) (100,0,0)
(0,0,100) (100,0,0) (0,100,0)
};
\addplot3[surf,mesh/rows=3] coordinates {
(33.33,0,0) (0,33.33,0) (0,0,33.33)
(0,33.33,0) (0,0,33.33) (33.33,0,0)
(0,0,33.33) (33.33,0,0) (0,33.33,0)
};
\end{axis}
\end{tikzpicture}





\end{landscape}


\end{document}