
Quiero hacer un diagrama de dispersión y variar el mark size
dependiente de una variable. Además, quiero que el color de la marca dependa del valor meta dado en un archivo (que funciona en el código dado). Como ejemplo, quiero una dependencia no lineal como mark size = sqrt(y value of point)
o, alternativamente, usar una variable de un bucle for. Dado que el tamaño de la marca parece esperar una longitud, simplemente no encuentro forma de hacer algunos cálculos, ya que mis pruebas con \pgfmathresult
algunas \edef...
macros no tuvieron éxito.
Logré cambiar el tamaño de la marca con el código.
scatter/@pre marker code/.style={/tikz/mark size={4-\pgfkeysvalueof{/data point/y}/4}},%\pgfmathparse{1}\pgfmathresult},
scatter/@post marker code/.style={}
Sin embargo, la asignación de color al valor meta se pierde entonces.
\documentclass[tikz, border=5mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usetikzlibrary{plotmarks}
\usepackage{amsmath}
\usepackage{filecontents}
\begin{filecontents*}{temp.dat}
1 1 100
2 2 200
3 3 300
4 4 400
5 5 500
6 6 600
7 7 700
8 8 800
9 9 900
10 10 1000
\end{filecontents*}
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
width=4.5in,
height=3.5in,
scale only axis,
xmin=0,
xmax=10,
ymin=0,
ymax=10,
axis x line*=bottom,
axis y line*=left,
colorbar
]
\addplot[%
scatter=true,
only marks,
mark=*,
color=blue,
point meta=explicit symbolic,
%scatter/@pre marker code/.style={/tikz/mark size= f (yvalue)?},
%scatter/@post marker code/.style={}
] table [meta index=2] {temp.dat};
\end{axis}
\end{tikzpicture}%
\end{document}
El código de ejemplo se copia desde aquí:¿Cómo mantener el mismo color de marca cuando se utilizan metadatos para el tamaño del marcador?
Respuesta1
Editar:
Encontré algunos problemas con mi primera respuesta enviada. Pensé que el problema era la falta \usepackage{filecontents}
pero, como señaló Jake, eso no debería importar. De todos modos, agregué una segunda solución en la que el tamaño de la marca y la escala de la barra de colores en realidad representan el y
valor.
\documentclass[tikz, border=5mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usetikzlibrary{plotmarks}
\usepackage{amsmath}
\usepackage{filecontents}
\begin{filecontents*}{temp.dat}
x y
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
10 100
\end{filecontents*}
\begin{document}
\pgfplotstableread{temp.dat}{\tempdat}
\begin{tikzpicture}
\begin{axis}[%
width=4.5in,
height=3.5in,
scale only axis,
xmin=0,
xmax=10,
ymin=0,
axis x line*=bottom,
axis y line*=left,
colorbar
]
\addplot[%
scatter=true,
only marks,
mark=*,
color=blue,
visualization depends on = {y/2 \as \perpointmarksize},
scatter/@pre marker code/.append style={/tikz/mark size=\perpointmarksize},
] table [x={x},y={y}] {\tempdat};
\end{axis}
\end{tikzpicture}
\end{document}
Respuesta original:
Funciona si reemplaza las líneas comentadas con lo siguiente (consulte la sección 4.25 en el manual):
visualization depends on = {y \as \perpointmarksize},
scatter/@pre marker code/.append style={/tikz/mark size=\perpointmarksize},
Código completo:
\documentclass[tikz, border=5mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usetikzlibrary{plotmarks}
\usepackage{amsmath}
\begin{filecontents*}{temp.dat}
1 1 100
2 2 200
3 3 300
4 4 400
5 5 500
6 6 600
7 7 700
8 8 800
9 9 900
10 10 1000
\end{filecontents*}
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
width=4.5in,
height=3.5in,
scale only axis,
xmin=0,
xmax=10,
ymin=0,
ymax=10,
axis x line*=bottom,
axis y line*=left,
colorbar
]
\addplot[%
scatter=true,
only marks,
mark=*,
color=blue,
point meta=explicit symbolic,
visualization depends on = {y \as \perpointmarksize},
scatter/@pre marker code/.append style={/tikz/mark size=\perpointmarksize},
] table [meta index=2] {temp.dat};
\end{axis}
\end{tikzpicture}%
\end{document}