polar graph :: scatter to contour
Qianlix
About drawing polar contour based scatter date (radial, Angle, image_z, waves stored in table0).
In igor I convert them into matrix using <XYZtoMatrix>.
I also used origin to plot the same data. the screenshot is "polar_contour_in_origin".
My question si why the two results are different ?
In igor, interpolated results don't seem to be what I want.
first create x and y waves from your radius and angle.
Then create an empty polar graph with Igor 9.05.
From the graph menu, choose append contour, but make sure you choose the HorizCrossing and VertCrossing axes.
From the Modify Contour Appearance dialog, choose Fill Contours.
Open the Modify Polar Graph panel, switch to the range tab, and set the radius and angle ranges to match.
November 16, 2023 at 03:10 pm - Permalink
Thank you for your advice.
Sorry, I didn't make myself clear.
What I mean is why do the two programs plot differently based on same data?
Which one should I trust?
November 16, 2023 at 06:32 pm - Permalink
hello, Jim
follow your advice:
ModifyContour image_z fill=1
Will this get the right results?
what am I missing?
November 16, 2023 at 06:50 pm - Permalink
In reply to Thank you for your advice. … by Qianlix
I don't know anything about Origin, but it looks like the Origin graph has the text "Speed mode is on", which might indicate that it's downsampling your data or otherwise altering the representation of the data in order to make the drawing faster. You might try turning speed mode off before you compare the plots.
November 17, 2023 at 06:30 am - Permalink
I've attached my implementation of what I think you are going for (a polar image not a contour).
After creating the interpolated image, I used the Modify Polar Graph panel's Append Image button (requires Igor 9.05) to select the created image matrix, and then adjusted the polar graph axes ranges and other settings (angle direction and angle 0 location) to match the image's angle direction and angle 0 location specified in the ImageFromPolarCoordinates macro.
See the .png attachment for the result.
For those that don't want to download the revised experiment, I implemented the following code to convert from polar to rectangular followed by ImageInterpolate:
Macro ImageFromPolarCoordinates(wRadiusName, rows, wAngleName, cols, wSpeedName, clockwiseChoice, displayImageChoice, zeroAtChoice)
String wRadiusName="radial"
String wAngleName="Angle"
String wSpeedName="image_z"
Variable rows=200, cols=200
Variable clockwiseChoice = 2 // 1=ccw, 2=cw
Variable zeroAtChoice = 3 // 1 = right, 2 = left, 3 = top, 4 = bottom
Variable displayImageChoice = 1 // 1 = yes, 2 = no
Prompt wRadiusName,"Radius Wave",popup,WaveList("*",";","DIMS:1")
Prompt wAngleName,"Angle Wave (degrees)",popup,WaveList("*",";","DIMS:1")
Prompt wSpeedName,"Speed wave (z)",popup,WaveList("*",";","DIMS:1")
Prompt rows,"number of rows for matrix"
Prompt cols,"number of columns for matrix"
Prompt clockwiseChoice,"Angle Direction",popup, "counter-clockwise;Clockwise;"
Prompt zeroAtChoice,"Zero at",popup, "right;left;top;bottom;"
Prompt displayImageChoice,"Display Image in New Graph",popup, "yes;no;"
Variable angleDir = clockwiseChoice == 1 ? 1 : -1
Variable angle0 = 0 // right
if( zeroAtChoice == 2 ) // left
angle0 = 180
endif
if( zeroAtChoice == 3 ) // top
angle0 = -90
endif
if( zeroAtChoice == 4 ) // bottom
angle0 = +90
endif
String imageName = fImageFromPolarCoordinates($wRadiusName, $wAngleName, $wSpeedName, rows, cols, angleDir, angle0)
if( displayImageChoice == 1 ) // yes
Display/K=0;AppendImage $imageName
ModifyGraph width={Plan,1,bottom,left}
// Set Axes Symmetrical about zero
SetAxis/A/E=2 left
SetAxis/A/E=2 bottom
ModifyImage ''#0 ctab= {*,*,Turbo,0}
if( 0 ) // debugging
String dir = StringFromList(clockwiseChoice-1,"counter-clockwise;Clockwise;")
String where = StringFromList(zeroAtChoice-1,"right;left;top;bottom;")
TextBox/C/N=choices dir +" at "+where
endif
endif
End
// returns name of image
Function/S fImageFromPolarCoordinates(radius, angle, speed, rows, cols, angleDir, angle0)
Wave radius, angle, speed // presumed same length 1-D waves, angle in degrees
Variable rows, cols
Variable angleDir, angle0
String prefix= NameOfWave(radius)+NameOfWave(angle)
String nameX = prefix+"_polarX"
String nameY = prefix+"_polarY"
Duplicate/O radius, $nameX,$nameY
WAVE wx = $nameX
WAVE wy = $nameY
wx = radius * cos((angleDir*angle-angle0)*pi/180)
wy = radius * sin((angleDir*angle-angle0)*pi/180)
// determine the X and Y bounds of the XY data
WaveStats/M=0/Q wx
Variable xmin= V_min, xmax = V_max
Variable dx= (xmax-xmin) / (rows-1)
if( dx <= 0 )
DoAlert 0, "max X must be greater than min X!"
return ""
endif
xmax += dx + dx/2 // version 6.38: ImageInterpolate computes nXPoints=floor(abs(xmax-xmin)/dx)
WaveStats/M=0/Q wy
Variable ymin= V_min, ymax = V_max
Variable dy= (ymax-ymin) / (cols-1)
if( dy <= 0 )
DoAlert 0, "max Y must be greater than min Y!"
return ""
endif
ymax += dy + dy/2
// ImageInterpolate requires triplet wave
String tripletName=prefix+"_temp"
Concatenate/O/DL {wx,wy,speed},$tripletName
WAVE wtriplet=$tripletName
Variable outerValue=NaN // transparent outside of boundary
Variable pftl = 1e-5 // overcome perturbation
String imageName = prefix+"_image"
ImageInterpolate/DEST=$imageName/PFTL=(pftl)/E=(outerValue)/S={(xmin),(dx),(xmax),(ymin),(dy),(ymax)} Voronoi, wtriplet
KillWaves/Z wtriplet
return imageName
End
November 17, 2023 at 01:41 pm - Permalink
In reply to I've attached my… by JimProuty
Thank you very much.
I learned a lot from your answer.
November 18, 2023 at 04:07 am - Permalink