PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : x% einer Zelle farbig machen?



suell
28-11-2012, 13:50
Hallo,
mit \cellcolor kann ich ja einer Zelle in einer Tabelle einen farbigen Hintergrund zuweisen.

Ist es irgendwie möglich, z.b. nur 65% der Zelle einzufärben? Bzw. einen Verlauf mit hartem wechsel von Farbe zu weiß?. (egal welches Pakt ich dazu brauchen würde).

Schönen Gruß
suell

hakaze
28-11-2012, 13:57
Ich nehme mal an, du möchtest so etwas wie die Excel-Funktion zu schnellen Übersicht über die Größe von Zahlen in einzelnen Zellen. Prinzipiell lässt sich das mit TikZ/pgf bewerkstelligen. Zwei Lösungen (auch eine ohne TikZ) sind hier beschrieben:

Partially coloring cell background to fake histogram (http://tex.stackexchange.com/q/81994/17198)

suell
28-11-2012, 14:29
Hallo,
ja das ist genau, was ich suche.

Allerdings blick ich da noch niht so durch ;).
Wie bekomme ich es beim ersten Beispiel denn hin, dass dieser Balken nur in der dritten Zelle angezeigt wird?

Das zweite Beispiel läuft bei mir leider nicht, so dass ich es hier noch nicht versuchen konnte es anzupassen.

hakaze
28-11-2012, 14:36
Mach doch mal bitte ein kurzes Beispiel (http://www.minimalbeispiel.de/mini.html) wie die Tabelle aussieht, mit Kommentaren wo du dir das wie vorstellst!

suell
28-11-2012, 16:27
Hi,

die für die hhier eingefärbten Zellen sollen diese Balken angewandt werden, sodass der kleinste Wert nicht eingefärbt ist und der höchste komplett.

Viele Grüße
suell




\documentclass[a4paper,12pt,bibliography=totoc,listof=totoc]{scrreprt}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{booktabs}

\usepackage{color,colortbl}
\definecolor{Grau}{gray}{0.7}
\begin{document}


\begin{table}[htbp]
\centering
\begin{tabular}{rrrr}
\toprule
\multicolumn{1}{c}{a} & \multicolumn{1}{c}{b} & \multicolumn{1}{c}{c} & \multicolumn{1}{c}{d} \\
\midrule
0,1 & 0,1 & \cellcolor{Grau}402,2262896 & 0,1 \\
0,2 & 0,2 & \cellcolor{Grau}403,8168396 & 0,2 \\
0,3 & 0,3 & \cellcolor{Grau}405,2878883 & 0,3 \\
0,4 & 0,4 & \cellcolor{Grau}406,644184 & 0,4 \\
0,5 & 0,5 & \cellcolor{Grau}407,9090581 & 0,5 \\
0,6 & 0,6 & \cellcolor{Grau}409,091184 & 0,6 \\
0,7 & 0,7 & \cellcolor{Grau}410,1818883 & 0,7 \\
0,8 & 0,8 & \cellcolor{Grau}411,1578396 & 0,8 \\
0,9 & 0,9 & \cellcolor{Grau}411,9877732 & 0,9 \\
1 & 1 & \cellcolor{Grau}412,5694279 & 1 \\
\bottomrule
\end{tabular}%
\caption{Test}
\label{tab:Test}%
\end{table}%


\end{document}

hakaze
28-11-2012, 16:51
Hier mal ein Beispiel mit einigen Anpassungen von mir. Beachte die Kommentare im LAtex-Code!


\documentclass[paper=a4, fontsize=12pt, bibliography=totoc, listof=totoc]{scrreprt}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{booktabs}

\usepackage[table]{xcolor} % statt color UND colortbl
\definecolor{Grau}{gray}{0.7}

% Code von tex.sx
\usepackage{tikz,array,collcell}
\usetikzlibrary{calc}
\pgfdeclarelayer{background}
\pgfdeclarelayer{main}
\pgfsetlayers{background,main}
\newif\ifnegativeValues
\newcommand{\tikzMe}[1]{%
\tikz[baseline]{
\node[anchor=base,text width=\minWidth,align=\alignment,inner sep=0pt,inner xsep=\tabcolsep,outer sep=0pt] (n) {\strut$#1$};
\begin{pgfonlayer}{background}
\ifnegativeValues
\pgfmathparse{#1<0?"red!50":"Grau"} % hier Grau statt green!25
\edef\color{\pgfmathresult}
\else
\def\color{Grau} % hier Grau statt green!25
\fi
\pgfmathparse{abs((#1-\minValue)/(\maxValue-\minValue))}
\fill[color=\color] (n.north west) rectangle ($(n.south west)!\pgfmathresult!(n.south east)$);
\end{pgfonlayer}
}
}
%\negativeValuestrue % inserts a minus sign for the minWidth and use red for negative values
\negativeValuesfalse % doesn't insert a minus sign, uses only green

\newcolumntype{H}[3]{%
%@{} % nutze normalen tabcolsep
>{%
\ifx\\#1\\\def\alignment{right}\else\def\alignment {#1}\fi%
\ifnegativeValues\def\minValue{0.}\else\def\minVal ue{#2}\fi%
\def\maxValue{#3}%
\def\minWidth{\widthof{$\ifnegativeValues-\fi#3$}}%
\collectcell\tikzMe%
}c<{\endcollectcell}
%@{} % nutze normalen tabcolsep
}

\begin{document}


\begin{table}[htbp]
\centering
\caption{nur 1 Spalte grau} % TabellenÜBERschrift
\label{tab:Test}%
\begin{tabular}{rr>{\cellcolor{Grau}}rr}
\toprule
\multicolumn{1}{c}{a} & \multicolumn{1}{c}{b} & \multicolumn{1}{c}{c} & \multicolumn{1}{c}{d} \\
\midrule
0,1 & 0,1 & 402,2262896 & 0,1 \\
0,2 & 0,2 & 403,8168396 & 0,2 \\
0,3 & 0,3 & 405,2878883 & 0,3 \\
0,4 & 0,4 & 406,644184 & 0,4 \\
0,5 & 0,5 & 407,9090581 & 0,5 \\
0,6 & 0,6 & 409,091184 & 0,6 \\
0,7 & 0,7 & 410,1818883 & 0,7 \\
0,8 & 0,8 & 411,1578396 & 0,8 \\
0,9 & 0,9 & 411,9877732 & 0,9 \\
1 & 1 & 412,5694279 & 1 \\
\bottomrule
\end{tabular}%
\end{table}%

\begin{table}[htbp]
\centering
\caption{mit TikZ zur Einfärbung nach Zahlenwert}
\label{tab:Test}%
\begin{tabular}{rrH{}{402.2262896}{412.5694279}r}
\toprule
\multicolumn{1}{c}{a} & \multicolumn{1}{c}{b} & \multicolumn{1}{c}{c} & \multicolumn{1}{c}{d} \\
\midrule
0,1 & 0,1 & 402.2262896 & 0,1 \\
0,2 & 0,2 & 403.8168396 & 0,2 \\
0,3 & 0,3 & 405.2878883 & 0,3 \\
0,4 & 0,4 & 406.644184 & 0,4 \\
0,5 & 0,5 & 407.9090581 & 0,5 \\
0,6 & 0,6 & 409.091184 & 0,6 \\
0,7 & 0,7 & 410.1818883 & 0,7 \\
0,8 & 0,8 & 411.1578396 & 0,8 \\
0,9 & 0,9 & 411.9877732 & 0,9 \\
1 & 1 & 412.5694279 & 1 \\
\bottomrule
\end{tabular}%
\end{table}%
\end{document}
Allerdings funktioniert es soweit erst einmal nur mit einem Punkt als Dezimaltrenner. In den pgfmathparse-Optionen stecke ich noch nicht genug drin, um das noch zu ändern.

suell
28-11-2012, 17:35
Hi,
ah das sieht schonmal sehr gut aus. Vielen Dank

Natürlich habe ich mein Minimalbeispiel zu minimal gemacht..
In der Spalte, die eingefärbt werden soll, stehen keine Zahlen sondern Prozentwerte. Gibt es da eine Möglichkeit, diese zu ignorieren für die Farbbalkenberechnung zu igonieren, sie aber in der Tabelle mit anzuzeigen?

Ansonsten könnte man sicherlich eine Spalte nur mit % Zeichen direkt daneben klatschen oder?

Siehe im Beispiel unten in Spalte 2.


Falls da noch wer anders weiterweiß mit dem Punkt statt Komma, Ideen noch gerne gesucht ;)



\documentclass[paper=a4, fontsize=12pt, bibliography=totoc, listof=totoc]{scrreprt}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{booktabs}

\usepackage[table]{xcolor} % statt color UND colortbl
\definecolor{Grau}{gray}{0.7}

% Code von tex.sx
\usepackage{tikz,array,collcell}
\usetikzlibrary{calc}
\pgfdeclarelayer{background}
\pgfdeclarelayer{main}
\pgfsetlayers{background,main}
\newif\ifnegativeValues
\newcommand{\tikzMe}[1]{%
\tikz[baseline]{
\node[anchor=base,text width=\minWidth,align=\alignment,inner sep=0pt,inner xsep=\tabcolsep,outer sep=0pt] (n) {\strut$#1$};
\begin{pgfonlayer}{background}
\ifnegativeValues
\pgfmathparse{#1<0?"red!50":"Grau"} % hier Grau statt green!25
\edef\color{\pgfmathresult}
\else
\def\color{Grau} % hier Grau statt green!25
\fi
\pgfmathparse{abs((#1-\minValue)/(\maxValue-\minValue))}
\fill[color=\color] (n.north west) rectangle ($(n.south west)!\pgfmathresult!(n.south east)$);
\end{pgfonlayer}
}
}
%\negativeValuestrue % inserts a minus sign for the minWidth and use red for negative values
\negativeValuesfalse % doesn't insert a minus sign, uses only green

\newcolumntype{H}[3]{%
%@{} % nutze normalen tabcolsep
>{%
\ifx\\#1\\\def\alignment{right}\else\def\alignment {#1}\fi%
\ifnegativeValues\def\minValue{0.}\else\def\minVal ue{#2}\fi%
\def\maxValue{#3}%
\def\minWidth{\widthof{$\ifnegativeValues-\fi#3$}}%
\collectcell\tikzMe%
}c<{\endcollectcell}
%@{} % nutze normalen tabcolsep
}

\begin{document}


\begin{table}[htbp]
\centering
\caption{mit TikZ zur Einfärbung nach Zahlenwert}
\label{tab:Test}%
\begin{tabular}{rrH{}{402.2262896}{412.5694279}r}
\toprule
\multicolumn{1}{c}{a} & \multicolumn{1}{c}{Prozentwerte} & \multicolumn{1}{c}{c} & \multicolumn{1}{c}{d} \\
\midrule
0,1 & 0.1\% & 402.2262896 & 0,1 \\
0,2 & 0.2\% & 403.8168396 & 0,2 \\
0,3 & 0.3\% & 405.2878883 & 0,3 \\
0,4 & 0.4\% & 406.644184 & 0,4 \\
0,5 & 0.5\% & 407.9090581 & 0,5 \\
0,6 & 0.6\% & 409.091184 & 0,6 \\
0,7 & 0.7\% & 410.1818883 & 0,7 \\
0,8 & 0.8\% & 411.1578396 & 0,8 \\
0,9 & 0.9\% & 411.9877732 & 0,9 \\
1 & 1\% & 412.5694279 & 1 \\
\bottomrule
\end{tabular}%
\end{table}%
\end{document}

hakaze
28-11-2012, 17:52
Okay die Zahlenformatierung habe ich hinbekommen (allerdings noch nicht für Prozentwerte):

\documentclass[paper=a4, fontsize=12pt, bibliography=totoc, listof=totoc,%
% captions=nooneline % statt flushleft-Umgebung in captions!!!
]{scrreprt}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{booktabs}

\usepackage[table]{xcolor} % statt color UND colortbl
\definecolor{Grau}{gray}{0.7}


% Code von tex.sx
\usepackage{tikz,array,collcell}
\usetikzlibrary{calc}
\pgfkeys{/pgf/number format/.cd, use comma,1000 sep={}, precision=7} % Formatvorgabe für \pgfmathprintnumber, siehe pgfmanual.pdf S. 546 ff.
\pgfdeclarelayer{background}
\pgfdeclarelayer{main}
\pgfsetlayers{background,main}
\newif\ifnegativeValues
\newcommand{\tikzMe}[1]{%
\tikz[baseline]{
\node[anchor=base,text width=\minWidth,align=\alignment,inner sep=0pt,inner xsep=\tabcolsep,outer sep=0pt] (n) {\strut\pgfmathprintnumber{#1}}; % hier wird die Zahl formatiert
\begin{pgfonlayer}{background}
\ifnegativeValues
\pgfmathparse{#1<0?"red!50":"Grau"} % hier Grau statt green!25
\edef\color{\pgfmathresult}
\else
\def\color{Grau} % hier Grau statt green!25
\fi
\pgfmathparse{abs((#1-\minValue)/(\maxValue-\minValue))}
\fill[color=\color] (n.north west) rectangle ($(n.south west)!\pgfmathresult!(n.south east)$);
\end{pgfonlayer}
}
}
%\negativeValuestrue % inserts a minus sign for the minWidth and use red for negative values
\negativeValuesfalse % doesn't insert a minus sign, uses only green

%column H takes three arguments: #1 = alignment (default right), #2 = minimal value, #3 = maximal value
\newcolumntype{H}[3]{%
%@{} % normalen tabcolsep
>{%
\ifx\\#1\\\def\alignment{right}\else\def\alignment {#1}\fi%
\ifnegativeValues\def\minValue{0.}\else\def\minVal ue{#2}\fi%
\def\maxValue{#3}%
\def\minWidth{\widthof{$\ifnegativeValues-\fi#3$}}%
\collectcell\tikzMe%
}c<{\endcollectcell}
%@{} % normalen tabcolsep
}

\begin{document}

\begin{table}[htbp]
\centering
\caption{mit TikZ-Balken, Balkenlänge nach Zahlenwert}
\label{tab:Test2}%
\begin{tabular}{rH{}{0.0}{1.0}H{}{402.2262896}{412 .5694279}r}
\toprule
\multicolumn{1}{c}{a / min} & \multicolumn{1}{c}{Werte / \%} & \multicolumn{1}{c}{c / MHz} & \multicolumn{1}{c}{d / kg} \\
\midrule
0,1 & 0.1 & 402.2262896 & 0,1 \\
0,2 & 0.2 & 403.8168396 & 0,2 \\
0,3 & 0.3 & 405.2878883 & 0,3 \\
0,4 & 0.4 & 406.644184 & 0,4 \\
0,5 & 0.5 & 407.9090581 & 0,5 \\
0,6 & 0.6 & 409.091184 & 0,6 \\
0,7 & 0.7 & 410.1818883 & 0,7 \\
0,8 & 0.8 & 411.1578396 & 0,8 \\
0,9 & 0.9 & 411.9877732 & 0,9 \\
1 & 1.0 & 412.5694279 & 1 \\
\bottomrule
\end{tabular}%
\end{table}%
\end{document}
Da das Prozentzeichen aber auch so eine Art (sich wiederholende) Einheit ist, würde ich es auch durchaus in den Tabellenkopf setzen.

suell
28-11-2012, 18:18
Du hast recht, das % Zeichen kann auch in den Kopf bzw. steht eh schon da, dann brauche ich es nicht immer wiederholen.

Sieht genau aus, wie ich es brauche. Super und Danke!

suell
01-12-2012, 17:00
Ah mir ist noch was aufgefallen.

Wenn ich eine Zahl mit festen Kommastellen habe, z.B. 0,100 werden die hinteren Nullen abgeschnitten, sodass nur noch 0,1 angezeigt wird. Kann man da noch was machen?

schöne grüße

hakaze
01-12-2012, 18:40
Das geht bei der Angabe der Zahlenformatierung mit fester Anzahl der Nachkommastellen:

\pgfkeys{/pgf/number format/.cd, use comma, 1000 sep={}, precision=3, fixed zerofill}
% Formatvorgabe für \pgfmathprintnumber, siehe pgfmanual.pdf S. 546 ff.

suell
01-12-2012, 21:12
Hey,

das ging ja mal wieder schnell :).

Jau jetzt füllt er das immer auf. Allerdings mit einer festen precision.
So eine allerletzte Frage, wie bekomme ich es jetzt hin, dass er in der einen Spalte auf 2 Stellen rundet und in der anderen auf 4?

Könntest du mir da noch ein letztes Mal weiterhelfen? Da ich am Montag meine Arbeit abgeben muss, hab ich den Kopf gerade ziemlich voll, sodass ich da in der Anleitung nicht durchblicke/keine Zeit habe, mich reinzuarbeiten.

Vielen Dank!

hakaze
02-12-2012, 13:59
So, hier die finale (?) Version:
\documentclass[paper=a4, fontsize=12pt, bibliography=totoc, listof=totoc ]{scrreprt}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{booktabs}

\usepackage[table]{xcolor} % statt color UND colortbl
\definecolor{Grau}{gray}{0.7}


% Code von tex.sx
\usepackage{tikz,array,collcell}
\usetikzlibrary{calc}
\pgfdeclarelayer{background}
\pgfdeclarelayer{main}
\pgfsetlayers{background,main}
\newif\ifnegativeValues
\newcommand{\tikzMe}[1]{%
\tikz[baseline]{
\node[anchor=base,text width=\minWidth,align=\alignment,inner sep=0pt,inner xsep=\tabcolsep,outer sep=0pt] (n) {\strut\pgfmathprintnumber{#1}}; % hier wird die Zahl formatiert
\begin{pgfonlayer}{background}
\ifnegativeValues
\pgfmathparse{#1<0?"red!50":"Grau"} % hier Grau statt green!25
\edef\color{\pgfmathresult}
\else
\def\color{Grau} % hier Grau statt green!25
\fi
\pgfmathparse{abs((#1-\minValue)/(\maxValue-\minValue))}
\fill (n.north west) rectangle ($(n.south west)!\pgfmathresult!(n.south east)$);
\end{pgfonlayer}
}
}
%\negativeValuestrue % inserts a minus sign for the minWidth and use red for negative values
\negativeValuesfalse % doesn't insert a minus sign, uses only green

[COLOR="Red"]% H-Spalte hat 3 Argumente (Anpassung von mir):
% #1 = Anzahl Nachkommastellen, #2 = Minimalwert, #3 = Maximalwert
\newcolumntype{H}[3]{%
%@{} % normalen tabcolsep
>{%
\pgfkeys{/pgf/number format/.cd, use comma, 1000 sep={}, precision=#1, fixed, fixed zerofill}%
\def\alignment{right}%
\ifnegativeValues\def\minValue{0.}\else\def\minVal ue{#2}\fi%
\def\maxValue{#3}%
\def\minWidth{\widthof{$\ifnegativeValues-\fi#3$}}%
\collectcell\tikzMe%
}c<{\endcollectcell}
%@{} % normalen tabcolsep
}

\begin{document}

\begin{table}[htbp]
\centering
\caption{mit TikZ-Balken, Balkenlänge nach Zahlenwert}
\label{tab:Test2}%
\begin{tabular}{rH{2}{0.0}{1.0}H{4}{402.000}{412.6 000}r}
\toprule
\multicolumn{1}{c}{a / min} & \multicolumn{1}{c}{Werte / \%} & \multicolumn{1}{c}{c / MHz} & \multicolumn{1}{c}{d / kg} \\
\midrule
0,1 & 0.1 & 402.2262896 & 0,1 \\
0,2 & 0.2 & 403.8168396 & 0,2 \\
0,3 & 0.3 & 405.2878883 & 0,3 \\
0,4 & 0.4 & 406.644184 & 0,4 \\
0,5 & 0.5 & 407.9090581 & 0,5 \\
0,6 & 0.6 & 409.0911840 & 0,6 \\
0,7 & 0.7 & 410.1818883 & 0,7 \\
0,8 & 0.8 & 411.1578396 & 0,8 \\
0,9 & 0.9 & 411.9877732 & 0,9 \\
1 & 1.0 & 412.5694279 & 1 \\
\bottomrule
\end{tabular}%
\end{table}%
\end{document}

Ich habe die pgfkeys-Answeiung mit der Einstellung für die Zahlenformatierung in die Spaltendefinition mit reingepackt. Das erste Argument ist jetzt die Anzahl der Nachkommastellen; die Ausrichtung ist immer rechtsbündig.

suell
02-12-2012, 18:23
Ja jetzt endlich final - lecker. Vielen Dank.

e271
03-12-2012, 09:35
Hi,

wenn ich als letzte Tabellenzeile folgendes einfüge, hat der Balken in der dritten Spalte die falsche Länge:

0,8 & 0.05 & 400.1578396 & 0,8 \\

hakaze
03-12-2012, 09:58
Ja, das stimmt! Man muss zwingend selbst die Minimal- und Maximalwerte pro Spalte raussuchen und als Parameter übergeben, damit die Berechnung (richtig) funktioniert:
\pgfmathparse{abs((#1-\minValue)/(\maxValue-\minValue))}Diese Limitierung hat auch schon die ursprüngliche Lösung (http://tex.stackexchange.com/a/81998/17198).

Aktuell habe ich auch keine Idee, wie man das lösen könnte. Es müssten ja mind. 2 Durchgänge notwendig sein, wobei man erstmal alle Werte pro Spalte parst, um die Min/Max-Werte zu bestimmen.