pgfplots: Säulen in Diagramm einfärben

Tabellen und Grafiken erstellen und anordnen


ehwlt
Forum-Anfänger
Forum-Anfänger
Beiträge: 36
Registriert: Sa 5. Mär 2011, 13:29

pgfplots: Säulen in Diagramm einfärben

Beitrag von ehwlt »

Hallo,

ich habe mir ein Säulendiagramm wie das folgende erstellt, mit Daten aus einer CSV-Datei:

Code: Alles auswählen

\documentclass{scrartcl}

\usepackage{tikz,pgfplots}
\usepackage{pgfplotstable}

\begin{filecontents}{data.csv}
Patient;Gewicht
Hund 1;50
Hund 2;45
Katze 1;10
Katze 2;10
Katze 3;11
Papagei;3
\end{filecontents}

\begin{document}

\pgfplotstableread[col sep=semicolon]{data.csv}{\Tabelle}

\begin{tikzpicture}%
    [trim axis left, trim axis right]%
    \begin{axis}[%
        set layers,%
        ybar=3mm,%
        xtick=data,%
        xticklabels from table={\Tabelle}{Patient},%
        x tick label style={rotate=60},%
        nodes near coords%
    ]%
        \addplot table [x expr=\coordindex,y index=1,col sep=semicolon] {\Tabelle};%
    \end{axis}
\end{tikzpicture}

\end{document}
Wie kann ich die Säulen je Tier in einer anderen Farbe plotten (also zum Beispiel Hund 1/2 blau, Katze 1–3 rot und Papagei lila)?

cis
Forum-Anfänger
Forum-Anfänger
Beiträge: 24
Registriert: Mi 22. Jul 2020, 20:14

Re: pgfplots: Säulen in Diagramm einfärben

Beitrag von cis »

Am übersichtlichsten dürfte sein, wenn man eine Tabellenspalte für die Farbe ergänzt:

Patient;Gewicht; Farbe
Hund 1;50; blue!44
Hund 2;45;
Katze 1;10; red
Katze 2;10;
Katze 3;11;
Papagei;3; purple

Komfortablerweise sollte die Farbe einer Gruppe nur einmal eingangs angegeben werden müssen; also kann man die Farben so definieren:

\pgfplotstableread[col sep=semicolon]{\jobname-data.csv}{\Tabelle}
\pgfplotstablegetrowsof{\Tabelle}
\pgfmathtruncatemacro{\RowsNo}{\pgfplotsretval-1}
% \RowsNo

% Zwecks Übersichtlichkeit separat: Farben definieren
\xdef\tempcolor{black}% Falls erste Farbe undefiniert
\pgfplotsinvokeforeach{0,...,\RowsNo}{%%
\pgfplotstablegetelem{#1}{Farbe}\of{\Tabelle}
\xdef\tempcolor{\ifx \pgfplotsretval\empty \tempcolor \else \pgfplotsretval \fi}
\colorlet{barcolor#1}{\tempcolor}% define
%\colorbox{\tempcolor}{\tempcolor}, % show test 1
}%%
%\colorbox{barcolor3}{Text}, % show test 2

Mit
\pgfplotsset{
select row/.style={
x filter/.code={\ifnum\coordindex=#1\else\def\pgfmathresult{}\fi}
} }

und dann
\pgfplotsinvokeforeach{0,...,\RowsNo}{%%
\addplot[fill=barcolor#1,] table[select row=#1, x expr=#1]{\Tabelle};
}%%

werden die bars schließlich einzeln gezeichnet, in der gewünschten Farbe.

5555555.png

Code: Alles auswählen

\documentclass[a4paper]{article}
\usepackage{pgfplots, pgfplotstable}
\pgfplotsset{compat=1.17}
\pgfplotsset{
select row/.style={
x filter/.code={\ifnum\coordindex=#1\else\def\pgfmathresult{}\fi}
}                }
 
\begin{document}

\section{Allgemeines Beispiel}
\pgfplotstableread[col sep=comma, header=false]{
a, 1, blue!33
b, 2, red
c, 3, 
d, 3, 
e, 5, yellow
f, 6, yellow
g, 8,
h, 7, orange
i, 9,
j, 10,
k, 11, cyan
}\mydata
\pgfplotstablegetrowsof{\mydata}
\pgfmathtruncatemacro{\RowsNo}{\pgfplotsretval-1}

% Zwecks Übersichtlichkeit separat: Farben definieren
\xdef\tempcolor{black}% Falls erste Farbe undefiniert
\pgfplotsinvokeforeach{0,...,\RowsNo}{%%
\pgfplotstablegetelem{#1}{[index] 2}\of{\mydata}
\xdef\tempcolor{\ifx \pgfplotsretval\empty \tempcolor \else \pgfplotsretval \fi}
\colorlet{barcolor#1}{\tempcolor}% define
%\colorbox{\tempcolor}{\tempcolor}, % show test 1
}%%
%\colorbox{barcolor3}{Text}, % show test 2



\begin{tikzpicture}[]
\begin{axis}[
ybar,  bar width=4mm, bar shift=0pt,
xtick={0,...,\RowsNo},
xticklabels from table={\mydata}{0},
x tick label style={rotate=60},
nodes near coords,
]
\pgfplotsinvokeforeach{0,...,\RowsNo}{%%
\addplot[fill=barcolor#1,] table[select row=#1, x expr=#1]{\mydata};
}%%
\end{axis}
\end{tikzpicture}

\section{Hier}
\begin{filecontents}[overwrite]{\jobname-data.csv}
Patient;Gewicht; Farbe
Hund 1;50; blue!44
Hund 2;45; 
Katze 1;10; red
Katze 2;10; 
Katze 3;11; 
Papagei;3; purple
\end{filecontents}

\pgfplotstableread[col sep=semicolon]{\jobname-data.csv}{\Tabelle}
\pgfplotstablegetrowsof{\Tabelle}
\pgfmathtruncatemacro{\RowsNo}{\pgfplotsretval-1}
% \RowsNo

% Zwecks Übersichtlichkeit separat: Farben definieren
\xdef\tempcolor{black}% Falls erste Farbe undefiniert
\pgfplotsinvokeforeach{0,...,\RowsNo}{%%
\pgfplotstablegetelem{#1}{Farbe}\of{\Tabelle}
\xdef\tempcolor{\ifx \pgfplotsretval\empty \tempcolor \else \pgfplotsretval \fi}
\colorlet{barcolor#1}{\tempcolor}% define
%\colorbox{\tempcolor}{\tempcolor}, % show test 1
}%%
%\colorbox{barcolor3}{Text}, % show test 2

\begin{tikzpicture}[trim axis left, trim axis right]
\begin{axis}[
% set layers, % kein Effekt
ybar,  bar width=3mm, bar shift=0pt,
%xtick=data, % <------ !
xtick={0,...,\RowsNo}, % <------ !
xticklabels from table={\Tabelle}{Patient},
x tick label style={rotate=60},
nodes near coords,
]
% Alt: 
%\addplot table[x expr=\coordindex,y index=1,col sep=semicolon]{\Tabelle};
% Neu:
\pgfplotsinvokeforeach{0,...,\RowsNo}{%%
\addplot[fill=barcolor#1,] table[select row=#1, x expr=#1]{\Tabelle};
}%%
\end{axis}
\end{tikzpicture}

\end{document}

Antworten