Textfarbe im TikZ-Stil aus der Farbtabelle fügt Text zu Knoten hinzu (kann z. B. nicht „text=.!50!black“ verwenden)

Textfarbe im TikZ-Stil aus der Farbtabelle fügt Text zu Knoten hinzu (kann z. B. nicht „text=.!50!black“ verwenden)

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!blackgenau wie der Rand eine dunklere Farbe hat.

Die Textfarbe ist zu hell

Wenn ich die Zeile auskommentiere text = .!50!black, hat der Text zwar die gewünschte Farbe, allerdings !50!blackerscheint die Zeichenfolge auch in den Beschriftungen.

Text erscheint im Etikett

Wie kann ich eine Änderung des Beschriftungstextes vermeiden und dennoch die Textfarbe ändern?

Antwort1

Verschieben Sie die Farbe .in die folgenden Mischungen tempund verwenden Sie sie anschließend tempdarin:

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

verwandte Informationen