pgfplots: Säulen in Diagramm einfärben

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: pgfplots: Säulen in Diagramm einfärben

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

von cis » Mi 29. Jul 2020, 13:28

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
\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}

pgfplots: Säulen in Diagramm einfärben

von ehwlt » Mo 2. Mär 2020, 19:28

Hallo,

ich habe mir ein Säulendiagramm wie das folgende erstellt, mit Daten aus einer CSV-Datei:
\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)?

Nach oben