Ich habe folgendes Minimalbeispiel:
\documentclass[border=2mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat = 1.12}
\pgfplotsset{
every axis/.style = {
colormap name = viridis,
},
}
\tikzset{
cmapfill/.style = {
color of colormap = {#1},
draw = .!50!black,
% text = .!50!black,
fill = .!25!white,
},
}
\begin{document}
\begin{tikzpicture}
\node[cmapfill = 200] (x) at (0, 0) {$x$};
\node[cmapfill = 700] (y) at (1, 0) {$y$};
\end{tikzpicture}
\end{document}
Das funktioniert gut, außer dass der Text in den Knoten die Farbe der Farbkarte hat und ich möchte, dass er .!50!black
genau wie der Rand eine dunklere Farbe hat.
Wenn ich die Zeile auskommentiere text = .!50!black
, hat der Text zwar die gewünschte Farbe, allerdings !50!black
erscheint die Zeichenfolge auch in den Beschriftungen.
Wie kann ich eine Änderung des Beschriftungstextes vermeiden und dennoch die Textfarbe ändern?
Antwort1
Verschieben Sie die Farbe .
in die folgenden Mischungen temp
und verwenden Sie sie anschließend temp
darin:
\documentclass[border=2mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat = 1.12}
\pgfplotsset{
every axis/.style = {
colormap name = viridis,
},
}
\tikzset{
cmapfill/.style = {
color of colormap = {#1},
/utils/exec={\colorlet{temp}{.}},
draw = temp!50!black,
text = temp!50!black,
fill = temp!25!white,
},
}
\begin{document}
\begin{tikzpicture}
\node[cmapfill = 200] (x) at (0, 0) {$x$};
\node[cmapfill = 700] (y) at (1, 0) {$y$};
\end{tikzpicture}
\end{document}
Antwort2
Dies ist keine Antwort auf die Frage, aber als Workaround habe ich mithilfe von Matplotlib, woher pgfplots ursprünglich die Farbtabelle bezogen hat, eine Liste mit vordefinierten Farben erstellt:
from matplotlib import cm
cmap = cm.get_cmap('viridis')
for z in range(0, 51):
print('\\definecolor{{viridis{}}}{{rgb}}{{{},{},{}}}'.format(z, *cmap(z * 0.02)))
Dieser Druck
\definecolor{viridis0}{rgb}{0.267004,0.004874,0.329415}
...
\definecolor{viridis50}{rgb}{0.993248,0.906157,0.143936}
Nach der Definition
\tikzset{
viridis/.style = {
text = viridis#1!75!black,
draw = viridis#1!75!black,
fill = viridis#1!25!white,
},
}
Es kann dann verwendet werden als
\begin{tikzpicture}
\node[viridis = 10] (x) at (0, 0) {$x$};
\node[viridis = 35] (y) at (1, 0) {$y$};
\end{tikzpicture}
Dies funktioniert in TikZ, ohne dass pgfplots überhaupt geladen werden müssen.