Ich verwende pgfplot, um ein Y-Balkendiagramm zu zeichnen. Es kann Farbe für die vollständige Grafik füllen, aber ich möchte nur einen Behälter mit roter Farbe füllen. Füllen Sie z. B. Behälter 3 mit Rot.
Der aktuelle Code füllt alle Behälter wie unten mit roter Farbe:
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\usepackage{filecontents}
\begin{filecontents}{test.dat}
15
20
22
10
5
15
33
27
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis lines=left,
ymajorgrids = true,
%xticklabel interval boundaries,
x tick label style={rotate=30,anchor=east}
]]
\addplot[black,fill=red!5,ybar interval] table[x expr=\coordindex,y index=0] {test.dat};
\end{axis}
\end{tikzpicture}
\end{document}
Die Ausgabe lautet:
Drei Fragen:
- Wie füllt man Behälter 3 nur mit roter Farbe?
- So stellen Sie die Y-Achse so ein, dass sie bei 0 beginnt (derzeit ist sie 5).
- Der letzte Behälter sollte 7 sein, aber anscheinend wurde dieser nicht aufgezeichnet.
Antwort1
Hier ist ein weiterer Vorschlag, ybar
stattdessen zu verwendenybar interval
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\usepackage{filecontents}
\begin{filecontents}{test.dat}
15
20
22
10
5
15
33
27
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\newcommand\coordindexmax{7}% the maximum of the coordindex
\begin{axis}[
axis y line=left,
axis x line*=left,
ymajorgrids = true,
ymin=0,
x tick label style={rotate=30,anchor=east},
xtick={0,...,\coordindexmax},
ybar,
bar shift=0pt,
bar width=(\pgfkeysvalueof{/pgfplots/width}-45pt)/(\coordindexmax+1),
enlarge x limits={abs=\pgfkeysvalueof{/pgf/bar width}/2}
]
\addplot[black,fill=red!5] table[x expr=\coordindex,y index=0] {test.dat};
\addplot[black,fill=red] table[x expr=\coordindex,y index=0,
restrict expr to domain={\coordindex}{3:3}
] {test.dat};
\end{axis}
\end{tikzpicture}
\end{document}
Beachten Sie, dass Sie aus der Berechnung scale only axis
entfernen müssen, wenn Sie diese Option verwenden .-45pt
bar width
Es ist auch möglich, die xtick
und zu verschiebenxticklabel
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\usepackage{filecontents}
\begin{filecontents}{test.dat}
15
20
22
10
5
15
33
27
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\newcommand\coordindexmax{7}% the maximal coordindex
\begin{axis}[
axis y line=left,
axis x line*=left,
ymajorgrids = true,
ymin=0,
xtick style={xshift=-\pgfkeysvalueof{/pgf/bar width}/2},% shift the xtick
x tick label style={
xshift=-\pgfkeysvalueof{/pgf/bar width}/2, % shift the x xticklabel
rotate=30,anchor=east,
},
xtick={0,...,\coordindexmax},
ybar,
bar shift=0pt,
bar width=(\pgfkeysvalueof{/pgfplots/width}-45pt)/(\coordindexmax+1),
enlarge x limits={abs=\pgfkeysvalueof{/pgf/bar width}/2}
]
\addplot[black,fill=red!5] table[x expr=\coordindex,y index=0] {test.dat};
\addplot[black,fill=red] table[x expr=\coordindex,y index=0,
restrict expr to domain={\coordindex}{3:3}
] {test.dat};
\end{axis}
\end{tikzpicture}
\end{document}
Antwort2
Hier ist eine Lösung mit discard if
und discard if not
. Da Sie nicht jede Spalte sozusagen entsprechend einfärben können, müssen Sie sie mit den obigen Makros filtern.
Der Platz, den Sie vor und nach den Spalten sehen, wird durch bereitgestellt enlarge x limits={abs=0.5}
. Löschen Sie diese Zeile einfach oder kommentieren Sie sie aus, um sie zu entfernen. Ich empfehle jedoch, sie aus ästhetischen Gründen beizubehalten.
Der Inhalt erhält einen Zahlenwert von 1 bis 8, genannt Val, und der Wert selbst heißt in diesem Fall Num. Sie zeichnen also die red!5
und verwerfen die rote mit discard if={Val}{3}
, dann zeichnen Sie die rote und verwerfen den Rest mit discard if not={Val}{3}
. Dieser Befehl ist in der Präambel definiert.
Die letzte Spalte ist übrigens 8, gemäß dem Inhalt Ihrer test.dat
Datei.
Eine letzte Sache x expr=\coordindex
wurde beim Definieren der Spalten auskommentiert, red!5
da es sonst zu unerwünschten Ergebnissen kommt (ich bin mir ehrlich gesagt nicht sicher, warum, ich konnte das Problem nicht genau bestimmen). Ich habe auch entfernt ybar interval
und belassen ybar
.
\documentclass[border=10pt]{standalone}
\usepackage{filecontents}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{
discard if/.style 2 args={
x filter/.code={
\ifdim\thisrow{#1} pt=#2pt
\def\pgfmathresult{inf}
\fi
}
},
discard if not/.style 2 args={
x filter/.code={
\ifdim\thisrow{#1} pt=#2pt
\else
\def\pgfmathresult{inf}
\fi
}
}
}
\pgfplotsset{compat=1.8}
\begin{document}
\begingroup\newif\ifmy
\IfFileExists{test.dat}{}{\mytrue}
\ifmy
\begin{filecontents}{test.dat}
#Val Num
1 15
2 20
3 22
4 10
5 5
6 15
7 33
8 27
\end{filecontents}
\fi\endgroup
\begin{tikzpicture}
\begin{axis}[ybar=0pt,
axis lines=left,
ymajorgrids = true,
bar width=1,
x tick label style={rotate=30,anchor=east},
xtick={1,...,8},
ytick={0,5,10,...,30},
xmin=0,
xmax=8,
ymin=0,
ymax=35,
enlarge x limits={abs=0.5}
]
\addplot[ draw,
fill=red!5,
discard if={Val}{3},
ybar
]
table[
%x expr=\coordindex,
y index=0,
x=Val,
y=Num,
meta=Num
] {test.dat};
\addplot[ draw,
fill=red,
discard if not={Val}{3},
ybar
]
table[
x expr=\coordindex,
y index=0,
x=Val,
y=Num,
meta=Num
] {test.dat};
\end{axis}
\end{tikzpicture}
\end{document}
Antwort3
Es ist kein guter Code, aber er funktioniert.
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\usepackage{tikz}
\usepackage{filecontents}
\begin{filecontents}{test.dat}
15
20
22
10
5
15
33
27
27 % dummy
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis lines=left,
ymajorgrids = true,
xmin=0, xmax=8.5,
ymin=0, ymax=40,
xtick={1,2,3,4,5,6,7,8},
ytick={0,5,10,15,20,25,30,35},
x tick label style={rotate=30,anchor=east}
]]
\addplot[black,fill=red!5,ybar interval] table[x expr=\coordindex,y index=0] {test.dat};
\addplot[fill=red] coordinates
{(2,0) (2,23) (3,23) (3,0)} --cycle;
\end{axis}
\end{tikzpicture}
\end{document}