如何解决在 Gnuplot 中绘制代数生成的二维网格的最佳方法是什么?
我生成了一个 x 值的二维数组和一个 y 值的数组。每个 i,j 索引对应一个 x,y 点。我想从这些点创建一个网格,但我不知道如何去做。我想使用 fortran/GNUPLOT 来创建这个图。输出应如下所示:
这是在 matlab 中创建的,我单独绘制了每条垂直线和水平线。
解决方法
我认为这个子程序应该可以满足您的需求:
subroutine gnuplot_output(filename,ni,nj,x,y)
character(len=*),intent(in) :: filename
integer,intent(in) :: ni,nj
real(wp),intent(in) :: x(ni,nj),y(ni,nj)
integer :: unit,i,j
open(newunit=unit,file=filename)
do i = 1,ni-1
do j = 1,nj-1
write(unit,*) x(i,j),y(i,j)
write(unit,*) x(i+1,y(i+1,j+1),j+1)
write(unit,*)
end do
end do
close(unit)
end subroutine
随意使用代码(任何许可)。
为了生成一个封闭的单元格,您需要输出 4 个单元格的角坐标并重复第一个角坐标以使 gnuplot 绘制一条封闭线。对子例程的调用可能如下所示:
real(wp),allocatable :: x(:,:),y(:,:)
integer :: ni,nj
! ... allocate x and y and generate grids ...
! ... the shape(x) == [ni,nj],and shape(y) == [ni,nj]
call gnuplot_output("grid_cells.txt",y)
在 gnuplot 中你需要做的就是
plot "grid_cells.txt" w l
下图是在gnuplot中使用函数创建的:
这是一个仅限 gnuplot 的版本。您的数据是否已经存在于数据文件中?然后请展示一些示例数据线。代码需要一些更改。
代码:
### draw grid
reset session
# create some test data
set print $Data
N=50. # decimal point! otherwise gnuplot would do integer division
base(x) = x<1 || x>2 ? 0 : -0.8*(x-1.5)**2+0.2
do for [y=0:N] {
y0=y/N
do for [x=0:N] {
x0=x/N*3
y1=(1-base(x0))*y0+base(x0)
print sprintf("%g %g",x0,y1)
}
print "\n" # add empty line
}
set print
set view map
splot $Data u 1:2:0 w l notitle
### end of code
结果:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。