gnuplot 2D polar plot with heatmap from 3D dataset - possible?

前端 未结 2 1762
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-16 04:51

I\'d like to take a plot that I have done as a surface in 3D using cartesian coordinates and view it as a heatmap in 2D in POLAR coordinates. The reason for this is I am obt

相关标签:
2条回答
  • 2020-12-16 05:40

    I took the command file that Christoph posted and played around a bit and managed to get it working for my needs EXCEPT for the labels, which I am still having problems with. The plot is looking like this:

    limited angle polar plot with contours and pm3d surface

    In order to get this result, I had to recalculate the coordinates of my measurement data, changing them from a polar coordinate system (frequency=r, theta=off-axis angle, z=SPL) to a Cartesian one (x,y,z). At the same time I modified the way that the polar grid was presented. Although I wanted a logarithmic polar r-axis, Cartesian coordinates must be used for the pm3d data, so I took the log of the r data before using it to calculate x,y,z coordinates. Also, I knew that the minimum value of the polar log r-axis scale would be 10, and this seems to be set equal to the center of the plot when a logscale polar grid is used. In order for the grid and the surface data to line up properly, I subtracted log10(10) from the r values before using them to calculate the Cartesian coordinates used for the pm3d map. So in total, the equations I used were

    r = log10( frequency ) - 1
    x = r cos( theta )
    y = r sin( theta )
    z = SPL
    

    I then used the following command file to plot the data:

    reset 
    set terminal pngcairo size 800,800 
    set output '3d-polar.png'
    set lmargin at screen 0.05
    set rmargin at screen 0.85
    set bmargin at screen 0.1
    set tmargin at screen 0.9
    set pm3d map interpolate 20,20
    unset key
    set multiplot
    
    # plot the heatmap
    
    set cntrparam levels increment 3,-3, -24
    set contour surface
    set palette rgb 33,13,10 #rainbow (blue-green-yellow-red)
    set cbrange [-18:0]
    unset border
    unset xtics
    unset ytics
    set angles degree
    r = 3.31
    set xrange[-r:r]
    set yrange[-r:r]
    set colorbox user origin 0.9,0.1 size 0.03,0.8
    splot 'new_test.dat' using 1:2:3
    
    # now plot the polar grid only
    set style line 11 lc rgb 'black' lw 1 lt 0
    set grid polar ls 11
    set polar
    set logscale r 10
    set rrange[10:20000]
    unset raxis
    set rtics format '' scale 0
    set rtics (10,20,100,200,1000,2000,10000,20000)
    #unset parametric
    #set for [i=0:330:30] label at first (r+0.35)*cos(i), first (r+0.35)*sin(i) \
    #center sprintf('%d', i)
    
    plot NaN w l
    
    unset multiplot
    unset output
    

    The data used to generate the plot only span +/- 30 degrees, so only that sector fills the polar plot. Additional angular data can be used to fill out the plot.

    If I can get some help with labels, I can call this "done". I still need to get the labels of angle working. Input on how to label the polar r-axis tics that would be very welcome, too.

    0 讨论(0)
  • 2020-12-16 05:57

    The image plotting works only for equally distributed rectangular grids, just like any bitmap image is arranged. Otherwise you must use splot with pm3d.

    The set grid polar works only for 2D, so you must use multiplot to overlay your heatmap with the polar grid. Here a, quite lengthy, example to show you how it might work:

    reset
    set terminal pngcairo size 800,800
    set output '3d-polar.png'
    
    set lmargin at screen 0.05
    set rmargin at screen 0.85
    set bmargin at screen 0.1
    set tmargin at screen 0.9
    
    set pm3d map
    unset key
    
    set multiplot
    
    # plot the heatmap
    set parametric
    set isosamples 500
    
    unset border
    unset xtics
    unset ytics
    
    set angles degree
    r = 6
    set urange[0:r] # radius
    set vrange[0:360] # angle
    set xrange[-r:r]
    set yrange[-r:r]
    set colorbox user origin 0.9,0.1 size 0.03,0.8
    splot u*cos(v), u*sin(v), (cos(v)*besj0(2*u))**2
    
    # now plot the polar grid only
    set style line 11 lc rgb 'white' lw 2
    set grid polar ls 11
    set polar
    set rrange[0:r]
    unset raxis
    set rtics format '' scale 0
    unset parametric
    set for [i=0:330:30] label at first (r+0.35)*cos(i), first (r+0.35)*sin(i)\
    center sprintf('%d', i)
    plot NaN w l
    unset multiplot
    

    The result is:

    enter image description here

    And now some details about some tricks:

    • In order to get a square size, you can't use set size ratio 1, because the margins differ for the 2D and 3D plots, even if you would specify some absolute margins. Therefore, I set a square canvas size (terminal option size 800,800), and set appropriate absolute margins.

    • You cannot unset rtics because then the grid would disappear.

    • The grid labels must be set manually.

    • The colorbox was also set manually because otherwise it would have overlapped with the 0 label.

    • Plotting NaN does only plot the grid

    0 讨论(0)
提交回复
热议问题