
내 데이터를 플롯으로 만들려고 할 때 작은 문제가 발생했습니다. 기본적으로 저는 여러 속성을 지닌 10개의 서로 다른 객체를 작업하고 있습니다. 그래서 각 개체 속성을 나타내는 10개의 행과 많은 열이 있는 csv 파일이 있습니다. 각 행에는 일부 "공백"이 있습니다. 즉, 이 개체의 속성 값을 알 수 없습니다. 이는 다음 MWE에서 x, y, z 속성을 갖는 4개의 객체 A, B, C 및 D로 표시됩니다. 우리는 A와 D에 대해 x, y, z를 알고 B에 대해서는 x와 z, C에 대해서는 x와 y만 알고 있습니다.
\begin{filecontents*}{data.csv}
Label,x,y,z
A,1,5,9
B,4,,7
C,6,5,
D,7,3,4
\end{filecontents*}
\documentclass[11pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{csvsimple}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\pgfplotsset{plot coordinates/math parser=false}
\usepgfplotslibrary{groupplots}
\begin{document}
\pgfplotsset{
discard if not/.style 2 args={
x filter/.code={
\edef\tempa{\thisrow{#1}}
\edef\tempb{#2}
\ifx\tempa\tempb
\else
\def\pgfmathresult{inf}
\fi
}
}
}
\tikzset{every mark/.append style={scale=3}}
\pgfplotscreateplotcyclelist{mycolorlist}{%
mark=10-pointed star,only marks,point meta=explicit symbolic,blue,every mark/.append style={fill=blue!80!black}\\%
mark=diamond*,only marks,point meta=explicit symbolic,red,every mark/.append style={fill=red!80!black}\\%
mark=square*,only marks,point meta=explicit symbolic,brown!60!black,every mark/.append style={fill=brown!80!black}\\%
mark=pentagon*,only marks,point meta=explicit symbolic,black,every mark/.append style={solid,fill=black}\\%
}
\hspace*{-4cm}
\begin{tikzpicture}
\newcommand{\xx}{x};
\newcommand{\yy}{y};
\begin{groupplot}[group style={group size= 2 by 1,group name=myplot,horizontal sep=2.5cm,vertical sep = 3.5cm},cycle list name=mycolorlist,legend style={at={(1.,0.5)},anchor=west}]
\nextgroupplot[ylabel = {y},xlabel={x}]
\addplot+[discard if not={Label}{A},unbounded coords=discard]table[meta=Label,y=\yy,x=\xx,col sep=comma] {data.csv};\addlegendentry{A}
\addplot+[discard if not={Label}{B},unbounded coords=discard]table[meta=Label,y=\yy,x=\xx,col sep=comma] {data.csv};\addlegendentry{B}
\addplot+[ discard if not={Label}{C},unbounded coords=discard]table[meta=Label,y=\yy,x=\xx,col sep=comma] {data.csv};\addlegendentry{C}
\addplot+[ discard if not={Label}{D},unbounded coords=discard]table[meta=Label,y=\yy,x=\xx,col sep=comma] {data.csv};\addlegendentry{D}
\nextgroupplot[ylabel = {z},xlabel={x}]
\renewcommand{\yy}{z}
\addplot+[discard if not={Label}{A},unbounded coords=discard]table[meta=Label,y=\yy,x=\xx,col sep=comma] {data.csv};\addlegendentry{A}
\addplot+[discard if not={Label}{B},unbounded coords=discard]table[meta=Label,y=\yy,x=\xx,col sep=comma] {data.csv};\addlegendentry{B}
\addplot+[ discard if not={Label}{C},unbounded coords=discard]table[meta=Label,y=\yy,x=\xx,col sep=comma] {data.csv};\addlegendentry{C}
\addplot+[ discard if not={Label}{D},unbounded coords=discard]table[meta=Label,y=\yy,x=\xx,col sep=comma] {data.csv};\addlegendentry{D}
\end{groupplot}
\end{tikzpicture}
\end{document}
왼쪽 플롯에서 범례는 거짓입니다. 갈색 정사각형은 실제로 객체 C이고 검은색 오각형은 객체 D입니다(B는 y에 대한 값이 없습니다). 오른쪽 플롯에서 C는 z 속성에 대한 값이 없으므로 표시되어서는 안 됩니다.
따라서 기본적으로 각 속성을 개별적으로 가져와서 좋은 개체만 그릴 수 있지만 플롯할 속성이 너무 많아서 그렇게 하려면 엄청난 시간이 걸릴 것입니다.
누군가가 해결책을 가지고 있다면 정말 기쁠 것입니다 :)
감사해요
답변1
다음은 매우 어려운 솔루션이지만 작동합니다.
\documentclass[11pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{csvsimple}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\pgfplotsset{plot coordinates/math parser=false}
\usepgfplotslibrary{groupplots}
\usepackage{pgfplotstable}
\begin{document}
\pgfplotstableset{col sep=comma,string type}
\pgfplotstableread{
Label,x,y,z
A,1,5,9
B,4,,7
C,6,5,
D,7,3,4
}\Table
%\pgfplotstabletypeset[columns/Label/.style={string type}]{\Table}% for debugging
\pgfplotsset{
discard if not/.style 2 args={
x filter/.code={
\edef\tempa{\thisrow{#1}}
\edef\tempb{#2}
\ifx\tempa\tempb
\else
\def\pgfmathresult{inf}
\fi
}
}
}
\tikzset{every mark/.append style={scale=3}}
\pgfplotscreateplotcyclelist{mycolorlist}{%
mark=10-pointed star,only marks,point meta=explicit symbolic,blue,every mark/.append style={fill=blue!80!black}\\%
mark=diamond*,only marks,point meta=explicit symbolic,red,every mark/.append style={fill=red!80!black}\\%
mark=square*,only marks,point meta=explicit symbolic,brown!60!black,every mark/.append style={fill=brown!80!black}\\%
mark=pentagon*,only marks,point meta=explicit symbolic,black,every mark/.append style={solid,fill=black}\\%
}
\hspace*{-4cm}
\begin{tikzpicture}
\newcommand{\xx}{x};
\newcommand{\yy}{y};
%\pgfplotstablegetrowsof{\Table}
%\let\rows=\pgfplotsretval
\begin{groupplot}[group style={group size= 2 by 1,group name=myplot,horizontal sep=2.5cm,vertical sep = 3.5cm},cycle list name=mycolorlist,legend style={at={(1.,0.5)},anchor=west}]
\nextgroupplot[ylabel = {y},xlabel={x}]
\pgfplotsinvokeforeach{0,1,2,3}{
\pgfplotstablegetelem{#1}{Label}\of{\Table}
\let\mark=\pgfplotsretval
\pgfplotstablegetelem{#1}{\xx}\of{\Table}
\let\x=\pgfplotsretval
\pgfplotstablegetelem{#1}{\yy}\of{\Table}
\let\y=\pgfplotsretval
\ifx\empty\x\else
\ifx\empty\y\else
\addplot+[only marks] coordinates {(\x,\y)};
\addlegendentryexpanded{\mark}
\fi\fi}
\nextgroupplot[ylabel = {z},xlabel={x}]
\renewcommand{\yy}{z}
\pgfplotsinvokeforeach{0,1,2,3}{
\pgfplotstablegetelem{#1}{Label}\of{\Table}
\let\mark=\pgfplotsretval
\pgfplotstablegetelem{#1}{\xx}\of{\Table}
\let\x=\pgfplotsretval
\pgfplotstablegetelem{#1}{\yy}\of{\Table}
\let\y=\pgfplotsretval
\ifx\empty\x\else
\ifx\empty\y\else
\addplot+[only marks] coordinates {(\x,\y)};
\addlegendentryexpanded{\mark}
\fi\fi}
\end{groupplot}
\end{tikzpicture}
\end{document}