Image representation of 1D waves
Hello,
I have a set of 1D intensity (I) waves with the same scaling (E). The waves are labeled as "Sample_X_y".
The "X" identifier corresponds to an integer so I want to create an image representation of the kind E = E(X) with I as an intensity colorbar.
The problem is that the step in the X parameter is not equally spaced (that would be empty columns in the 2D mesh).
The following macro produces an image when X is equally spaced but I would like to extend it to a more general case so I could make use of all my data.
I think the idea is to apply interpolation to the data set to fill the intermediate values but I do not know how to proceed from here.
Any ideas or workaround?
Friedrich
The easiest and 'most honest' solution to your problem may be to fill your 2D wave with NaNs (not a number) for lines where the data is missing. This would produce 'gaps' in your image, but you can still create an image as usual with minimal changes. If you think it is OK to interpolate over the missing entries, this can be done. But before that it would be great to hear what Igor version you are using (and preferably which OS). To be honest, the attached code seems so old and has so many outdated lines that it seems almost covered with dust and spiderwebs. ;) Before recommending a more modern approach it would be best to first hear what you are running on. Could you maybe provide an example experiment file with some data? This would make it much easier to get some workable code.
August 11, 2021 at 08:16 am - Permalink
You can display a images with x and y waves. Here is an example where the y wave is not evenly spaced.
Read the help for AppendImage to understand how x and y waves work with images.
// Test function
// Creates an image wave
Make/O/N=(100,100) DataWave=sin(p*2*pi/100)*sin(q*2*pi/100)
// Creates x and y waves for the image
// the values in the x and y waves corresponds to the corners of the pixels!! Not the centers!!
Make/O/N=101 XWave, YWave
XWave=p
YWave=log(p/20+2)
// Creates the graph to display the image
Display
AppendImage DataWave vs {XWave, YWave}
end
August 11, 2021 at 08:31 am - Permalink
In reply to The easiest and 'most honest… by chozo
Hi Chozo,
Thanks for your reply. In fact, I am using IP 7.08 on macOS (Big Sur). Since you did tremendous work on the angle2K ipf for ARPES, you are familiar with the type of data I am handling with. My detector can only acquire EDC-type data with a long integration time. I think a 2D recreation of the (unoccupied) band dispersion from these 1D waves may allow for better visualization. This is what I was trying in my rusty code. Interpolation may come after but first I will try to fill it with NaNs as you suggested. I attached pxp with test data where the only variable in the wavename is the polar angle of the sample.
August 11, 2021 at 09:38 am - Permalink
Another option to consider, which is usually applicable to spectral scans, is to display this as a path object in Gizmo. See, for example, the GizmoWaterfall demo (IP9).
August 11, 2021 at 09:47 am - Permalink
I have written a quick function which does the approach I have suggested earlier, i.e., leaving gaps for missing data. My current approach requires you to set the current data folder and dial in the prefix and suffix manually, like this:
wave2image("Cu_0_","_rt")
Depending on how your data usually looks, a few steps could be further automated. For example, the function could be written to detect which data you have selected in the Data Browser, so that you don't have to manually set the folder. Also, you may be able to detect the prefix and suffix if your data naming follows a specific rule set.
Since the gaps are quite wide in your example, I don't think you'll get a meaningful result by interpolating over the gaps. Also note that Ole's suggestion of using scaling waves would only 'stretch the pixels' of the available data across the image to fill the gaps. Please let me know if you have any further questions about the code or the approach. Sorry, I didn't mean to make fun of your code or anything, so I hope you did not read that the wrong way. For the sake of writing more efficient program I still would recommend you to move away from macros and write functions instead.
August 11, 2021 at 08:14 pm - Permalink
In reply to I have written a quick… by chozo
I applied a MatrixFilter NanZapMedian specifying the background flag after the wave2image function. The image looks better now but of course, this is only testing data. In principle, the interpolation may be done in datasets with higher statistics. I also realized that my macro does not give the same image as the new function. It may be an obsolete approach because in python I could get the same image as the wave2image function. I did not read your comment in the wrong way, on the contrary, it helps me to improve the coding on IP.
August 13, 2021 at 01:12 am - Permalink
There were are few mistakes in your macro. For example you did not iterate over the different waves and the counter was off by one etc.. I have attached your old macro with a few details altered. Now it should give the same result as the new script for your test data. Have a look what is different.
August 13, 2021 at 04:05 am - Permalink