PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pgfplots: Füllfarbe je nach zu zeichnendem Wert



alexraasch
17-05-2010, 15:17
Hallo,

ich möchte mit pgfplots ein Balkendiagramm zeichnen, in der alle Balken, die eine bestimmte Obergrenze überschreiten automatisch eine andere Farbe erhalten. Hier das MB:



\documentclass{scrartcl}

\usepackage{pgfplots}

\begin{document}
% Obergrenze
\newcommand{\grenze}{9.5}
\begin{tikzpicture}

\begin{axis}[ybar, nodes near coords]

\addplot [fill=green!50!black] coordinates {(1, 10) (2, 12) (3, 6) (4, 14) (5, 9)};
\draw [red,very thick] (axis cs:1, \grenze) -- (axis cs:5, \grenze); % Obergrenze
\end{axis}
\end{tikzpicture}
\end{document}


Es gibt zwar Optionen wie "every mark" und "scatter/@pre marker code". Diese funktionieren aber nicht für Balkendiagramme (Option "ybar"). Gibt es eine Möglichkeit, soetwas zu bewerkstelligen?

Ich bin wie immer für jede Antwort dankbar, es sei denn sie lautet: Nimm PSTricks. :-)))

Feuersaenger
27-07-2010, 23:04
Hallo alexraasch,

Ich bin mir nicht sicher, ob ich Deine Anfrage korrekt verstanden habe. Falls Du den kompletten Balken je nach groesse des Funktionswertes einfaerben willst, kann ich Dir helfen. Falls Du nur den Teil des Balkens, der ueber \grenze ist, einfaerben willst, wird es komplizierter.

Falls Du also den ersten Punkt willst, also "falls y > \grenze, dann faerbe den kompletten Balken anders", dann koennte folgender Loesungsansatz hilfreich sein:


\newcommand{\grenze}{9.5}
\begin{tikzpicture}

\begin{axis}[ybar, nodes near coords]

\addplot [forget plot,fill=green!50!black,restrict y to domain=0:\grenze] coordinates {(1, 10) (2, 12) (3, 6) (4, 14) (5, 9)};
\addplot [fill=red!50!black,restrict y to domain=\grenze:100] coordinates {(1, 10) (2, 12) (3, 6) (4, 14) (5, 9)};
\draw [red,very thick] (axis cs:1, \grenze) -- (axis cs:5, \grenze); % Obergrenze

\end{axis}

\end{tikzpicture}


Die Idee ist, in dem ersten Plot alle von 0:\grenze rauszufiltern und in gruen zu zeichnen. Das "forget plot" sorgt dafuer, dass dieser "kuenstliche" Plot nicht wie ein normaler bar plot behandelt wird. Ein Normaler bar plot wuerde zu einer Verschiebung fuehren. Der zweite \addplot filtert nun alle bars mit \grenze:100 raus und malt die in rot.

Die Loesung funktioniert auch fuer viele Input koordinaten. Kernpunkt ist an sich nur das "forget plot"; das filtern koennte man zur Not ja auch von Hand machen (bei kleinen mengen).

Ich hoffe, das hilft weiter (auch, wenn Dein Post schon was aelter ist).

Mit liebem Gruss

Christian

bobmalaria
27-07-2010, 23:32
Willkommen im Forum Christian,

wir werden Deine Hilfe zu Deinem wunderbaren Paket zu schätzen wissen.

Grüße

Feuersaenger
28-08-2010, 15:37
Hallo bobmalaria,

Danke fuer Dein herzliches Willkommen :)

Mit liebem Gruss

Christian

alexraasch
28-08-2010, 16:10
Hallo Christian,

vielen Dank für Deine Antwort. Du hattest das Problem genau richtig verstanden. Aber Deine Lösung zeichnet alle Balken sowohl grün als auch rot. Was ich wollte, ist an den x-Werten 1, 2 und 4 einen roten Balken (weil y > \grenze); an den anderen x-Werten einen grünen.

Im Anhang das Ergebnis Deines Codes.

Gruß
Alex