我想使用 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.plt
GNUplot 的快速测试 (),我附上了代码和预览,可以通过包中的命令mal-test.png
加载。\includegraphics
graphicx
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"
更新:关于数据转换的说明
您可以将三个文件想象成这样(一个文件包含第一行,第二个文件包含第一列,最后一个文件包含单元格/数据集):
- 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