Calcular datos dentro de pst-plot/postscript y colorear condicionalmente la trama

Calcular datos dentro de pst-plot/postscript y colorear condicionalmente la trama

Obtengo muchos datos simulados en tablas con 13 columnas, desde donde quiero trazar lo siguiente: El eje x debe ser la columna número 12 (E), lo cual está bien con plotNoX=12. El eje y debe ser la columna número 10 (pops) dividida por la columna número 13 (degeneración).

Creo que el problema se puede resolver en posdata, pero no sé cómo acceder a los datos que contiene.

MWE con datos originales y gráfico de escala:

!TeX program = xelatex

\documentclass{scrartcl}
\usepackage{filecontents}
\begin{filecontents}{Boltzmann-Plot.txt}
,    E_J,     J,   component, E_v,       v,  N,  id,   numlines,  pops,  errors,  specie,        E,         degeneracy
0,   204.32,  3.5, 1,         32314.13,  0,  3,  155,  6,         2.0503590454,   0.0549585571,  32518.45,  8
1,   339.81,  4.5, 1,         32314.13,  0,  4,  157,  6,         1.9458976329,   0.0468620867,  32653.94,  10
2,   102.37,  2.5, 1,         32314.13,  0,  2,  153,  6,         1.909089931,    0.0630666458,  32416.5,   6
3,   508.54,  5.5, 1,         32314.13,  0,  5,  159,  6,         1.6624777745,   0.047496399,   32822.67,  12
4,   203.53,  2.5, 2,         32314.13,  0,  3,  154,  6,         1.4258811354,   0.0373668708,  32517.66,  6
5,   507.3,   4.5, 2,         32314.13,  1,  5,  158,  6,         1.3639953283,   0.0228045864,  32821.43,  10
6,   710.18,  6.5, 1,         32314.13,  1,  6,  161,  6,         1.303716013,    0.0202061018,  33024.31,  14
7,   34.19,   1.5, 1,         32314.13,  1,  1,  151,  5,         1.2909918307,   0.0810218945,  32348.32,  4
8,   338.79,  3.5, 2,         32314.13,  1,  4,  156,  6,         1.2815394104,   0.0191664948,  32652.92,  8
9,   944.35,  7.5, 1,         32314.13,  2,  7,  163,  6,         1.2091683402,   0.0533139809,  33258.48,  16
10,  08.71,   5.5, 2,         32314.13,  2,  6,  160,  6,         1.1679741692,   0.0403405467,  33022.84,  12
11,  942.65,  6.5, 2,         32314.13,  2,  7,  162,  6,         0.9963321806,   0.023514499,   33256.78,  14
12,  101.8,   1.5, 2,         32314.13,  2,  2,  152,  5,         0.9200611356,   0.0756242618,  32415.93,  4
13,  1210.61, 8.5, 1,         32314.13,  2,  8,  165,  6,         0.911434806,    0.0380645658,  33524.74,  18
\end{filecontents}
\usepackage[]{pst-plot}
\pagestyle{empty}
\readdata[ignoreLines=5]{\Boltzmann}{Boltzmann-Plot.txt}

\begin{document}
\begin{pspicture}
\begin{psgraph}[
Ox=3.3,dx=0.1,Dx=0.1,xlabelFactor={ \cdot 10^4},
Oy=-1,ylogBase=10,
comma]{->}(3.2,-1)(3.5,1.1){12cm}{9cm}
\pstScalePoints(1e-4,1){}{log}
\listplot[plotNoMax=12,plotNo=9,plotNoX=12,yMinValue=0.00001,plotstyle=dots]{\Boltzmann}
\end{psgraph}
\end{pspicture}
\end{document}

editar: eliminó un aspecto

edición 2: para la corrección física, los pops deben dividirse por degeneración, no multiplicarse

Respuesta1

Con una versión actualizada pst-plottambién puedes usar el ignoreLinesargumento opcional para \psreadDataColumn.

Verde es y10*y12:

\documentclass{scrartcl}
\usepackage{filecontents}
\begin{filecontents*}{Boltzmann-Plot.txt}
    ,    E_J,     J,   component, E_v,       v,  N,  id,   numlines,  pops,  errors,  specie,        E,         degeneracy
    0,   204.32,  3.5, 1,         32314.13,  0,  3,  155,  6,         2.0503590454,   0.0549585571,  32518.45,  8
    1,   339.81,  4.5, 1,         32314.13,  0,  4,  157,  6,         1.9458976329,   0.0468620867,  32653.94,  10
    2,   102.37,  2.5, 1,         32314.13,  0,  2,  153,  6,         1.909089931,    0.0630666458,  32416.5,   6
    3,   508.54,  5.5, 1,         32314.13,  0,  5,  159,  6,         1.6624777745,   0.047496399,   32822.67,  12
    4,   203.53,  2.5, 2,         32314.13,  0,  3,  154,  6,         1.4258811354,   0.0373668708,  32517.66,  6
    5,   507.3,   4.5, 2,         32314.13,  1,  5,  158,  6,         1.3639953283,   0.0228045864,  32821.43,  10
    6,   710.18,  6.5, 1,         32314.13,  1,  6,  161,  6,         1.303716013,    0.0202061018,  33024.31,  14
    7,   34.19,   1.5, 1,         32314.13,  1,  1,  151,  5,         1.2909918307,   0.0810218945,  32348.32,  4
    8,   338.79,  3.5, 2,         32314.13,  1,  4,  156,  6,         1.2815394104,   0.0191664948,  32652.92,  8
    9,   944.35,  7.5, 1,         32314.13,  2,  7,  163,  6,         1.2091683402,   0.0533139809,  33258.48,  16
    10,  08.71,   5.5, 2,         32314.13,  2,  6,  160,  6,         1.1679741692,   0.0403405467,  33022.84,  12
    11,  942.65,  6.5, 2,         32314.13,  2,  7,  162,  6,         0.9963321806,   0.023514499,   33256.78,  14
    12,  101.8,   1.5, 2,         32314.13,  2,  2,  152,  5,         0.9200611356,   0.0756242618,  32415.93,  4
    13,  1210.61, 8.5, 1,         32314.13,  2,  8,  165,  6,         0.911434806,    0.0380645658,  33524.74,  18
\end{filecontents*}
\usepackage{pst-plot}
\pagestyle{empty}
\readdata[ignoreLines=5]{\Boltzmann}{Boltzmann-Plot.txt}
\psreadDataColumn[ignoreLines=1]{12}{,}{\xData}{Boltzmann-Plot.txt}
\psreadDataColumn[ignoreLines=1]{10}{,}{\yDataOne}{Boltzmann-Plot.txt}
\psreadDataColumn[ignoreLines=1]{13}{,}{\yDataTwo}{Boltzmann-Plot.txt}
\def\DATA{
  /X [\xData] def 
  /Y1 [\yDataOne] def  
  /Y2 [\yDataTwo] def             % save as array
  0 1 X length 1 sub {            % on stack is the loop variable
    /Index ED                     % save it 
    X Index get 
    Y1 Index get Y2 Index get mul % y10*y13
  } for 
}   

\begin{document}
\begin{pspicture}
\begin{psgraph}[
    Ox=3.3,dx=0.1,Dx=0.1,xlabelFactor={ \cdot 10^4},
    Oy=-1,ylogBase=10,comma]{->}(3.2,-1)(3.5,1.5){12cm}{9cm}
    \pstScalePoints(1e-4,1){}{log}
    \psset{plotstyle=dots,dotscale=1.5}
    \listplot[linecolor=green]{\DATA}
    \listplot[plotNoMax=12,plotNo=9,plotNoX=12,linecolor=red]{\Boltzmann}
    \listplot[plotNoMax=12,plotNo=12,plotNoX=12,linecolor=blue]{\Boltzmann}
\end{psgraph}
\end{pspicture}
\end{document}

ingrese la descripción de la imagen aquí

Coloreando los puntos según el uso de la columna v:

\documentclass{minimal}

\usepackage{pst-plot}
\pagestyle{empty}
\readdata[ignoreLines=5]{\Boltzmann}{Boltzmann-Plot.txt}
\psreadDataColumn[ignoreLines=1]{12}{,}{\xData}{Boltzmann-Plot.txt}
\psreadDataColumn[ignoreLines=1]{10}{,}{\yDataOne}{Boltzmann-Plot.txt}
\psreadDataColumn[ignoreLines=1]{13}{,}{\yDataTwo}{Boltzmann-Plot.txt}
\psreadDataColumn[ignoreLines=1]{6}{,}{\ColValue}{Boltzmann-Plot.txt}
\makeatletter
\def\specialPlot{%
  \begin@SpecialObj
  \addto@pscode{
    /X [\xData] def 
    /Y1 [\yDataOne] def  
    /Y2 [\yDataTwo] def             % save as array
    /Color [\ColValue] def
    0 1 X length 1 sub {            % on stack is the loop variable
      /Index exch def                     % save it 
      X Index get 1.e-4 mul
      Y1 Index get Y2 Index get mul log % log(y10*y13) 
      \tx@ScreenCoor 
      gsave
      3 0 360 arc 
      Color Index get /No exch def
      No 0 eq { 1 0 0 setrgbcolor } if 
      No 1 eq { 0 1 0 setrgbcolor } if 
      No 2 eq { 0 0 1 setrgbcolor } if 
      fill
      stroke
      grestore
    } for
  }
  \use@pscode
  \end@SpecialObj
}  
\makeatother
\begin{document}

\begin{pspicture}
\begin{psgraph}[
    Ox=3.3,dx=0.1,Dx=0.1,xlabelFactor={ \cdot 10^4},
    Oy=-1,ylogBase=10,comma]{->}(3.2,-1)(3.5,1.5){12cm}{9cm}
    \psset{plotstyle=dots,dotscale=1.5}
    \specialPlot
\end{psgraph}
\end{pspicture}
\end{document}

Comente fillpara círculos en lugar de puntos sólidos.

ingrese la descripción de la imagen aquí

Respuesta2

No estoy seguro de si esta es una respuesta. Al menos es un ancla para el comando \psreadColumnData, que no existe, y la información que se debería utilizar \psreadDataColumnen su lugar. Estos comandos funcionan bien.

ACTUALIZAR: Acomodado tu revisión: diven lugar de mul.

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{math}
\usepackage{filecontents}
%,    E_J,     J,   component, E_v,       v,  N,  id,   numlines,  pops,  errors,  specie,        E,         degeneracy
\begin{filecontents}{Boltzmann-Plot.txt}
0,   204.32,  3.5, 1,         32314.13,  0,  3,  155,  6,         2.0503590454,   0.0549585571,  32518.45,  8
1,   339.81,  4.5, 1,         32314.13,  0,  4,  157,  6,         1.9458976329,   0.0468620867,  32653.94,  10
2,   102.37,  2.5, 1,         32314.13,  0,  2,  153,  6,         1.909089931,    0.0630666458,  32416.5,   6
3,   508.54,  5.5, 1,         32314.13,  0,  5,  159,  6,         1.6624777745,   0.047496399,   32822.67,  12
4,   203.53,  2.5, 2,         32314.13,  0,  3,  154,  6,         1.4258811354,   0.0373668708,  32517.66,  6
5,   507.3,   4.5, 2,         32314.13,  1,  5,  158,  6,         1.3639953283,   0.0228045864,  32821.43,  10
6,   710.18,  6.5, 1,         32314.13,  1,  6,  161,  6,         1.303716013,    0.0202061018,  33024.31,  14
7,   34.19,   1.5, 1,         32314.13,  1,  1,  151,  5,         1.2909918307,   0.0810218945,  32348.32,  4
8,   338.79,  3.5, 2,         32314.13,  1,  4,  156,  6,         1.2815394104,   0.0191664948,  32652.92,  8
9,   944.35,  7.5, 1,         32314.13,  2,  7,  163,  6,         1.2091683402,   0.0533139809,  33258.48,  16
10,  08.71,   5.5, 2,         32314.13,  2,  6,  160,  6,         1.1679741692,   0.0403405467,  33022.84,  12
11,  942.65,  6.5, 2,         32314.13,  2,  7,  162,  6,         0.9963321806,   0.023514499,   33256.78,  14
12,  101.8,   1.5, 2,         32314.13,  2,  2,  152,  5,         0.9200611356,   0.0756242618,  32415.93,  4
13,  1210.61, 8.5, 1,         32314.13,  2,  8,  165,  6,         0.911434806,    0.0380645658,  33524.74,  18
\end{filecontents}
\usepackage[]{pst-plot}
\pagestyle{empty}
\readdata[ignoreLines=5]{\Boltzmann}{Boltzmann-Plot.txt}
\psreadDataColumn{12}{,}{\xData}{Boltzmann-Plot.txt}
\psreadDataColumn{10}{,}{\yDataOne}{Boltzmann-Plot.txt}
\psreadDataColumn{13}{,}{\yDataTwo}{Boltzmann-Plot.txt}
\def\DATA{ % tried to adapt from https://tex.stackexchange.com/a/141094/121799
  /X [\xData] def /Y [\yDataOne] def  /Z [\yDataTwo] def %save as array
  0 1 X length 1 sub {            % on stack is the loop variable
    /Index ED                     % save it 
    X Index get Y Index get Z Index get mul       % get x  and y as y/z
  } for }   
\typeout{\xData}    
\typeout{\yDataOne}  
\typeout{\yDataTwo}  
\begin{document}
\begin{pspicture}
\begin{psgraph}[
Ox=3.3,dx=0.1,Dx=0.1,xlabelFactor={ \cdot 10^4},
Oy=-1,ylogBase=10,
comma]{->}(3.2,-2)(3.5,1.1){12cm}{9cm}
\pstScalePoints(1e-4,1){}{log}
\listplot[plotstyle=dots]{\DATA}
%\listplot[plotNoMax=12,plotNo=9,plotNoX=12,yMinValue=0.00001,plotstyle=dots]{\Boltzmann}
\end{psgraph}
\end{pspicture}
\end{document}

ingrese la descripción de la imagen aquí

información relacionada