TeX 中的堆积图(添加行负载)

TeX 中的堆积图(添加行负载)

即使具备 pgf/TikZ 方面的一些基本经验,我仍然无法找到正确的方法或命令来在 TeX 中制作漂亮的图表。

想象一下,重量分布具有起始值和终止值以及线载荷,以 CSV 数据给出,约有 150 行。例如,如下所示:

x-start [m] | x-stop [m] | weight [t/m]  
-3;   5; 2.5  
2;   4 ; 5.6  
2.45;  6.33 ; 0.25  
-1; 2.3; 4  
4; 5 ; 7.8

我想生成一个图,其中 x 上加了权重。您可能会发现,处理作为扩展、重叠区域且没有离散点的负载非常困难。

如果您有解决这个问题的想法或提示,我将非常高兴!目前,我正在考虑评估离散点的权重,并将它们加起来,但我认为有一种更正确、更令人满意的方法 :-)

答案1

您说得对,离散化看起来是最简单的方法。以下是使用 asymptote 包的完整 MWE:

\begin{filecontents*}{./wd.csv}
# x-start [m] | x-stop [m] | weight [t/m]  
-3, 5, 2.5  
2, 4, 5.6  
2.45, 6.33, 0.25  
-1, 2.3, 4  
4, 5, 7.8
\end{filecontents*}
\documentclass[10pt,a4paper]{article}
\usepackage{asymptote}
\begin{document}
\begin{figure}
\center
\begin{asy}
import graph;
size(200,200,IgnoreAspect);
file fin=input("wd.csv").csv();
real[][] A=fin.dimension(0,3);                               
A=transpose(A);
real[] xStart=A[0];
real[] xStop=A[1];
real[] weight=A[2];
int rows=xStart.length;
real lmin=min(xStart);
real lmax=max(xStop);
real dl=lmax-lmin; // total length
int n=200; // resolution, the number of intervals
real[] PointY=new real[n+1];
PointY[:]=array(PointY.length,0.0); // initialize with 0
int beg,fin;
for(int i=0;i<rows;++i){
  beg=round((xStart[i]-lmin)/dl*n);
  fin=round((xStop[i]-lmin)/dl*n);
  for(int j=beg;j<=fin;++j){
    PointY[j]+=weight[i];
  } 
}
real[] PointX=new real[PointY.length];
for(int i=0;i<PointX.length;++i){
  PointX[i]=i/n*dl+lmin;
}
pen p=orange+2pt;
draw(graph(PointX,PointY),p);
real xmin,xmax;
real ymin,ymax;
xmin=lmin;
xmax=lmax;
ymin=0;
ymax=max(PointY);
xaxis("$x$,\,m",xmin,xmax, RightTicks());
yaxis("$w(x)$,\,t/m",ymin,ymax,
  LeftTicks(beginlabel=false,Step=2,step=1)
);
\end{asy}
\caption{Added up line loads}
\end{figure}
\end{document}

将此 MWE 复制到wd.tex单独的文件夹中,创建文件latexmkrc

sub asy {return system("asy '$_[0]'");}
add_cus_dep("asy","eps",0,"asy");
add_cus_dep("asy","pdf",0,"asy");
add_cus_dep("asy","tex",0,"asy");

并运行latexmk -pdf wd.tex。结果如下

在此处输入图片描述

相关内容