使用 PSTricks 绘制绘图和图像(来自 Matlab)

使用 PSTricks 绘制绘图和图像(来自 Matlab)

我想使用 PSTricks 绘制来自 Matlab 的一些数据。

我通常使用Matlab 中的imagesc和绘制这些数据colorbar,但我更愿意在 LaTeX 中来做……

这是我想要用 LaTeX 绘制的图片: 在此处输入图片描述

它实际上是绘制2 vectors(时间和速度)和1 array(颜色),但我不知道如何做到这一点......

有什么特别的PSTricks package方法吗?如果它可以读取 3 个数据文件,我会很简单...如果只是几个命令,那也很好...

编辑:提供数据文件

以下是数据(全部都是 .csv 文件):

  • 时间是一个 175x1 矩阵

  • 速度是一个 14112x1 矩阵

  • 张力是 ans 14112x175 矩阵......

我把它们压缩成压缩文件

数据相当庞大,不过10点的例子也不错。

答案1

它使用来自 Malipivo 的数据文件和pstricks-add.tex来自http://texnik.dante.de/tex/generic/pstricks-add/. 运行

latex --shell-escape <file>
dvips <file>
ps2pdf -dNOSAFER <file>.ps

shell-escape需要从文档内部运行外部程序texlua,该程序会动态创建具有 PSTricks 结构的数据文件。数据文件必须位于与此文档相同的目录中:

\documentclass{article}
\usepackage{pstricks-add}
\usepackage{filecontents}
\begin{filecontents*}{data.lua}
local c=0 -- a counter of data
print("Cashing 3 files...")
time="time.csv" -- 175
speed="speed.csv"
tension="tension.csv"
local times={}
for time in io.lines(time) do table.insert(times,time) end 
local speeds={}
for speed in io.lines(speed) do table.insert(speeds,speed) end 
local tensions={} 
for tension in io.lines(tension) do table.insert(tensions,tension) end 
topst=io.open("image.data","w")
topst:write("/contourdata [")
print("Processing "..#tensions.." lines...")
for tension=1,200 do -- #tensions or 300
  c=0
  topst:write("[\n")
  for mdata in string.gmatch(tensions[tension],"[^,]+") do
    c=c+1
    writeme=speeds[tension].." "..times[c].." "..mdata.."\n"
    topst:write(writeme)
  end 
topst:write("]")
end -- for tension

topst:write("] def\n")
\end{filecontents*}

\begin{document}
\immediate\write18{texlua data.lua}
\psset{xunit=1mm,yunit=2.5}
\begin{pspicture}(0,1)(70,3.5)
\pstContour[colored,colorOffset=100 add]{image.data}
\psaxes[labelFontSize=\footnotesize,mathLabel=false,Dx=10,Dy=0.5,Oy=1,
        ticksize=-5pt 0](0,1)(70,3.5)
\multido{\rA=1.0+0.01,\iA=383+1}{250}{\psline[linecolor={[wave]\iA}](70,\rA)(75,\rA)}
\psaxes[xAxis=false,Oy=-100,Dy=3,dy=0.5,ticksize=0 4pt,ylabelPos=right](75,1)(75,3.5)
\end{pspicture}
\end{document}

在此处输入图片描述

答案2

部分解决方案

我已经下载并解压了你的压缩文件。在该文件夹中,我创建了一个独立的 Lua 脚本 ( mal-preprocess.lua) 来处理这三个数据集。

输出是一个适用于 PSTricks 的文件 ( toimage-pst.data) 和一个适用于 PGFplots 的文件 ( toimage.data)。我不知道如何在 PSTricks 中正确设置图形,并且我已达到 PGFplots/pdflatex 的限制,因此所附示例仅限于#tensions(行数;Lua 代码中的第 33 行)到第一个200条目。

我在该文件夹中运行:

texlua mal-preprocess.lua

这些是 TeX 文件的骨架,我们运行:

latex mal-contour.tex
dvips mal-contour.dvi
ps2pdf mal-contour.ps

lualatex mal-contour-pgfplots.tex

我附上了 Lua 代码、这两个 TeX 文件以及来自 PGFplots 的代码片段预览(我遇到了一些困难ps2pdf)。该mal-preprocess.lua文件是:

-- I am mal-preprocess.lua...
-- I take 3 data sets and prepare data set for PSTricks...

--local pstricks=0 -- 0 (pgfplots) or 1 (pstricks)
local c=0 -- a counter of data

-- Cashing files...
print("Cashing 3 files...")
time="time.csv" -- 175
speed="speed.csv"
tension="tension.csv"
local times={}
for time in io.lines(time) do
table.insert(times,time)
end -- for time
local speeds={}
for speed in io.lines(speed) do
table.insert(speeds,speed)
end -- for speed
local tensions={}
for tension in io.lines(tension) do
table.insert(tensions,tension)
end -- for tension

-- The core...
whereto=io.open("../toimage.data","w")
topst=io.open("../toimage-pst.data","w")
topst:write("/contourdata [")

print("Processing "..#tensions.." lines...")
-- Load all lines...
--local temp=""
for tension=1,200 do -- #tensions or 300
c=0
topst:write("[\n")
-- Parse that one line...
for mdata in string.gmatch(tensions[tension],"[^,]+") do
  c=c+1
  writeme=speeds[tension].." "..times[c].." "..mdata.."\n"
  whereto:write(writeme)
  topst:write(writeme)
end -- for mdata

topst:write("]")
whereto:write("\n")
end -- for tension

topst:write("] def\n")

这是mal-contour.tex文件:

% run: latex mal-contour.tex
% -> ps; ->pdf
\documentclass{article}
\usepackage{pstricks-add}
\begin{document}
\psset{unit=0.1cm}
\begin{pspicture}[showgrid](0,1)(4775,3.5)
\pstContour[colored]{toimage-pst.data}
\end{pspicture}
\end{document}

第二个文件是mal-contour-pgfplots.tex

% run: lualatex engine mal-contour-pgfplots.tex
\documentclass[a4paper]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\begin{document}
\begin{tikzpicture}
\begin{axis}[view={0}{90},colorbar,grid=none]
\addplot3[surf,shader=interp,mesh/cols=175] file {toimage.data};
\end{axis}
\end{tikzpicture}
\end{document}

姆韦

我认为 GNUplot 是处理大型数据集的更好工具。我建议使用 TeX 级别的 PNG 文件,而不是矢量格式,因为其中包含太多元素。这是mal-test.pltGNUplot 的快速测试 (),我附上了代码和预览,可以通过包中的命令mal-test.png加载。\includegraphicsgraphicx

set terminal png
set output "mal-test.png"
unset key

set title ""
set xlabel ""
set ylabel ""

set xrange [ 0.0000 : 84.30000 ] noreverse nowriteback
set yrange [ 1.0000 : 3.50000 ] noreverse nowriteback
set zrange [ -100.0000 : -85.00000 ] noreverse nowriteback

splot "toimage.data"

mwe,GNUplot

更新:关于数据转换的说明

您可以将三个文件想象成这样(一个文件包含第一行,第二个文件包含第一列,最后一个文件包含单元格/数据集):

- A B C D
X 1 2 3 4
Y 5 6 7 8
Z 9 0 1 2

我们通过重复第一行和第一列的标签将它们转换为这种形式(但是,数据文件大小从 96200+12390248+1199=12487647 变为 48643360 字节 - toimage.data - 这就是我们通常不以这种形式保存数据的原因):

X A 1
X B 2
X C 3
X D 4

Y A 5
Y B 6
Y C 7
Y D 8

Z A 9
Z B 0
Z C 1
Z D 2

相关内容