legend position
ukos
I try to calculate the legend/colorscale position in percent of the plot area but it is not working using the ABSX and ABSY.
Function PrintLegendPosition(graph, name)
string graph, name
string anchorCode, exterior, Xpos, Ypos
variable absX, absY, fracx, fracy
string info = annotationinfo(graph, name, 1)
string flags = StringByKey("FLAGS", info, ":", ";", 1)
GetWindow $graph, gsize // Look up the size of the graph window, in points
variable g_left = V_left
variable g_right = V_right
variable g_top = V_top
variable g_bottom = V_bottom
GetWindow $graph, psize // look up the plot size in points
variable p_left = V_left
variable p_right = V_right
variable p_top = V_top
variable p_bottom = V_bottom
anchorcode = StringByKey("A", flags, "=", "/", 1)
exterior = StringByKey("E", flags, "=", "/", 1)
xPos = StringByKey("X", flags, "=", "/", 1)
yPos = StringByKey("Y", flags, "=", "/", 1)
absx = str2num(StringByKey("ABSX", info, ":", ";", 1))
absy = str2num(StringByKey("ABSY", info, ":", ";", 1))
fracx = (absx - p_left) / (p_right - p_left)
fracy = (absy - p_bottom) / (p_top - p_bottom)
print fracx, fracy
End
string graph, name
string anchorCode, exterior, Xpos, Ypos
variable absX, absY, fracx, fracy
string info = annotationinfo(graph, name, 1)
string flags = StringByKey("FLAGS", info, ":", ";", 1)
GetWindow $graph, gsize // Look up the size of the graph window, in points
variable g_left = V_left
variable g_right = V_right
variable g_top = V_top
variable g_bottom = V_bottom
GetWindow $graph, psize // look up the plot size in points
variable p_left = V_left
variable p_right = V_right
variable p_top = V_top
variable p_bottom = V_bottom
anchorcode = StringByKey("A", flags, "=", "/", 1)
exterior = StringByKey("E", flags, "=", "/", 1)
xPos = StringByKey("X", flags, "=", "/", 1)
yPos = StringByKey("Y", flags, "=", "/", 1)
absx = str2num(StringByKey("ABSX", info, ":", ";", 1))
absy = str2num(StringByKey("ABSY", info, ":", ";", 1))
fracx = (absx - p_left) / (p_right - p_left)
fracy = (absy - p_bottom) / (p_top - p_bottom)
print fracx, fracy
End
This is not getting anywhere. absx and absy sometimes are so wide out of range that the percentage gets 1,000% or so where it should rather be something like 0.5
Not sure though, if I should respect xPos or yPos and the exterior flag probably should trigger using gsize.
Can anyone help me out?
with middle anchors and no exterior it mostly works.
May 21, 2019 at 11:47 pm - Permalink
I tried your code and realized that I do not understand what you want to do at all. So you have a legend which is pinned to the exterior graph window and you want to extract the relative position in the complete window and not just the graph area?
Also, your code is incomplete in the sense that you nowhere use the information extracted from 'flags', which I believe is crucial when finding the legend position. For now fracx, fracy just give out the fractional position inside the graph area of the selected anchor point (not that I understand your formula, I just tested around a bit). This is more or less the same as the info provided by xpos, ypos (maybe inverted in some cases). So, first tell us a bit more about what you want to do.
May 22, 2019 at 07:49 pm - Permalink
Sorry for putting unused elements in my code here. It is not good for readability. I understand that. The unused parts are for WIP state only and are left overs from some experimenting with the "formula"
The current "formula" is not a fancy one and should be straight forward:
Consider to the top left corner of the graph window (0,0) and the bottom right corner of the graph window (1,1), this function gives out the position of the legend relative to this definition. It mostly works (I have attached my testing Experiment)
Sometimes, though, the absX and absY are rushung up to 4000 after the experiment start. Some runs later, everything is fine again. I guess it is a bug but after putting around 3h into it, i'm giving up.
I am specifically looking for a formula where absX and absY is avoided.
I could also give a lot more information if you want to, but I don't want to flood the forum here.
May 23, 2019 at 06:09 am - Permalink
could also be that I should consider different ScreenResoultion
May 23, 2019 at 07:25 am - Permalink
I ended up with a workaround that feels a bit hacky:
yPos = NumberByKey("Y", flags, "=", "/", 1)
fracy = yPos / 100
if(strsearch(anchorcode, "C", 0) > -1)
fracy *= -1
endif
fracx = xPos / 100
if(strsearch(anchorcode, "R", 0) > -1)
fracx = 1 - fracx
endif
if(strsearch(anchorcode, "M", 0) > -1)
fracx += 0.5
endif
May 23, 2019 at 08:26 am - Permalink
Thank you for clearing that up. If the problematic behavior only happens sometimes on start and you think it's a bug, then the Igor team may help out. But it seems you already settled for a workable solution. BTW, I do not find you code hacky at all. Basically, you are just using the most direct approach by tapping into the legend position information.
May 23, 2019 at 07:50 pm - Permalink
the center ("C") part is not right, btw. but I can live without using center anchors for now. I think the main problem in the IP implementation is that there is no differentiatiation between the anchor that lives on the scalebar/legend itself and the anchor that is attached on the window. Both anchors are basically set with the same flag. That may be convenient at first look but should probably be differntiated, e.g to have a RC anchor on the graph but a TL anchor on the scalebar.
May 24, 2019 at 12:51 am - Permalink
Have you considered to approach where you FIRST reset the anchor position to a defined setting (e.g. LT) and then SECOND position the annotation? I may have done this trick in the Annotations Tools package to help put the annotations in proper alignment https://www.wavemetrics.com/project/AnnotationTools.
May 24, 2019 at 10:15 am - Permalink
@jjweimer that is a good solution to work around the (complicated) anchor to position calculation but I want to preserve the anchor of the legend. The anchor in the window then needs re-calculating to a "fixed anchor" at TL.
If I would change the anchor to TL, then I would need to calculate the offset to the "old anchor" that lives on the legend with the width and length of the legend which does not make it easier.
May 25, 2019 at 05:56 am - Permalink
@ukos ... OK. I thought you might want to reposition the legend to a NEW position that is a percentage of the graph. I agree, when you want to preserve the current position but report it relative using a percent relative to the current anchor, you likely have to do the grunt work.
I am however not sure about this option:
* Switch all of the anchors to LT (do NOT change any of the anchor values)
* Do a graph update
--> I *think* this will keep everything positioned on the graph but will reset the position values internally (i.e in the graph recreation macro)
* From here, redo the percentage calculations using the easier LT common
I someday hope that we will have a feature to be able to position anchors in percentages relative to internal graph (width,height) parameters rather than always in absolute pixels or points.
May 28, 2019 at 04:30 pm - Permalink
In reply to @ukos ... OK. I thought you… by jjweimer
/X and /Y *are* values that are a percentage of the graph plot area's width and height. Not absolute pixels or points. So maybe use /X and /Y instead of ABSX and ABSY?
/X and /Y are reported in AnnotationInfo's FLAGS section.
Take a look at this help topic:
DisplayHelpTopic "Textbox, Legend, and Color Scale Positioning in a Graph"
May 29, 2019 at 09:29 am - Permalink
@JimProuty If you have a look at the code, you will see that I already found these values.
The problem is that the anchor for these values seems to change together with the anchor of the legend which makes it necessary to do some calculations to get the position of the legend anchor with respect to of the top left corner of the graph window.
May 30, 2019 at 05:17 am - Permalink