5

I have a large set of data with lab results that I'm looking to label in ArcMap. I'm trying to build a label expression that needs to produce a label that essentially needs to look like this:

B=5
T=10
E=200

So if B [BEN] is>= to 5, it will produce text that is bolded and red. If B is < 5, it will come out green, and if it is anything else it will come out B=ND. This is the code I have so far to do that, and it works:

def FindLabel ([BEN]):
 if float([BEN]) >= 5:
 return "<CLR red='255'><FNT size = '8'><BOL>" + "B=" + [BEN] + "</BOL></FNT></CLR>"
 elif float([BEN]) < 5:
 return"<CLR green='255'><FNT size = '8'>" + "B=" + [BEN] + "</FNT></CLR>"
 else:
 return "<CLR green='255'><FNT size = '8'>" + "B=ND" + "</FNT></CLR>"

The problem is that I also need to do this for compounds T, E, and so on...If I didn't want to use the if/else it would be simple, I could use something like:

return "B=" + [BEN] + "\n" + "E=" + [ETH] + "\n" + "T" + [TOL] + "\n" + "I=" + [ISO]

I basically need to have stacked labels (as shown above) while using the If/Then statements, and I'm really blanking on how to do this.

PolyGeo
65.5k29 gold badges115 silver badges350 bronze badges
asked Mar 15, 2017 at 19:33
2
  • Do you only want to show the stacked label variable if there is a particular value, or will you always have B, then T, then E, and just the formatting will be different based on the value? Commented Mar 15, 2017 at 20:09
  • @evv_gis I will always have B, T, and E...however, they will be formatted differently based on their value. Commented Mar 15, 2017 at 21:23

1 Answer 1

8

You could try something like the following.

def FindLabel ([BEN],[ETH],[TOL],[ISO]):
 vars = {"B":[BEN],"E":[ETH],"T":[TOL],"I":[ISO]}
 labelStrings = []
 for k,v in vars.items():
 if float(v) >= 5:
 labelStrings.append("<CLR red='255'><FNT size = '8'><BOL>{0}={1}</BOL></FNT></CLR>".format(k,v))
 elif float(v) < 5:
 labelStrings.append("<CLR green='255'><FNT size = '8'>{0}={1}</FNT></CLR>".format(k,v))
 else:
 labelStrings.append("<CLR green='255'><FNT size = '8'>{0}=ND</FNT></CLR>".format(k))
 return "\n".join(labelStrings)

Just a thought, There is no error checking in this code so if you have a string that cannot be converted to a float you will have issues

If they are constants which you compare them to you can try this (I used arbitrary constants for the comparing values):

def FindLabel ([BEN],[ETH],[TOL],[ISO]):
 vars = {"B":[BEN],"E":[ETH],"T":[TOL],"I":[ISO]}
 varConstants= {"B":5,"E":6,"T":20,"I":50}
 labelStrings = []
 for k,v in vars.items():
 if float(v) >= varConstants[k]:
 labelStrings.append("<CLR red='255'><FNT size = '8'><BOL>{0}={1}</BOL></FNT></CLR>".format(k,v))
 elif float(v) < varConstants[k]:
 labelStrings.append("<CLR green='255'><FNT size = '8'>{0}={1}</FNT></CLR>".format(k,v))
 else:
 labelStrings.append("<CLR green='255'><FNT size = '8'>{0}=ND</FNT></CLR>".format(k))
 return "\n".join(labelStrings)
PolyGeo
65.5k29 gold badges115 silver badges350 bronze badges
answered Mar 15, 2017 at 20:11
0

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.