我有一些表格形式的数据,如下面的代码所示。第二列是 y 轴。整列总和为 100。对于要绘制的每个 y 值,我想绘制y_value / y_total
例如10 / 100
、20 / 100
等。
我尝试使用 来执行此操作y expr
,但它仅限于访问当前行中的列。无论如何,重复计算每列的总和似乎并不理想。理想情况下,可以对列求和一次,然后我可以使用y expr
我事先计算的总和开始绘图。
我已经看到了一种通过转置表然后将其转置回来计算列总和的方法,但是总和存储在一行中,我无法总是访问它y expr
。
我怎样才能做到这一点?
\documentclass{article}
\usepackage{pgfplotstable}
\pgfplotsset{compat=newest}
\begin{document}
\pgfplotstableread{
1 10
2 20
3 30
4 40
}{\data}
\begin{tikzpicture}
\begin{axis}
% The 100 is hard-coded currently.
\addplot table[y expr=\thisrow{1}/100] {\data};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
因此,您追求的是类似以下内容的东西...有关详细信息,请查看代码中的注释。
% used PGFPlots v1.18.1
\documentclass[border=5pt]{standalone}
\usepackage{pgfplotstable}
\begin{document}
\begin{tikzpicture}
\pgfplotstableread{
x y
1 20
2 40
3 60
4 80
}{\loadedtable}
% add a column in the table summing up the values % accumulatively
% with the sum of all values one can calculate the percentages of the values
\pgfplotstablecreatecol[
expr accum={
round(\pgfmathaccuma) + \thisrow{y}
}{0}
]{sum}{\loadedtable}
% get the number of data rows of the loaded table
\pgfplotstablegetrowsof{\loadedtable}
\pgfmathsetmacro{\LastRow}{\pgfplotsretval-1}
% now get the last entry of the «sum» column which contains the
% sum of the values
\pgfplotstablegetelem{\LastRow}{sum}\of{\loadedtable}
\pgfmathsetmacro{\Sum}{\pgfplotsretval}
\begin{axis}
\addplot table[x=x,y expr=\thisrow{y}/\Sum] {\loadedtable};
\end{axis}
\end{tikzpicture}
\end{document}