Quantcast
Channel: 🎛️ Dash - Plotly Community Forum
Viewing all articles
Browse latest Browse all 6271

How to alter conditional statement for colouring of Scattermapbox based on two factors?

$
0
0

@mirceau wrote:

This week I started out with Python and Dash as I am eager to learn both.

My Goal:
I want to single out certain points which are detected by the sensors and color them red if they meet two conditions:

  • If they are detected between 01:00-05:00 a.m.
  • and if they are detected in a certain zone (assume that I have a list that has risk-probability per zone). So it should consider any risk larger than 0.6 also.

INTENDED CONDITION FOR COLORING:

IF x > 1 AND x < 5 AND risk[I] > 0.6 THEN color=red, ELSE listCoords.index.hour

Question:
How must the ‘color=np.append(np.insert(listCoords.index.hour, 0, 0), 23)’ part of my code change to reach my goal? I was thinking something along the lines of (without including the risk-list yet):

color=np.where(np.logical_and(listCoords.index.hour >= 1, listCoords.index.hour <= 5), np.append(np.insert(listCoords.index.hour, 0, 0), 23), 'red'),

But this does not work. Any help is much appreciated. :slight_smile:

Snippet of my code: scatter of points on geo map:

return go.Figure(
    data=[
        # Data for all rides based on date and time
        Scattermapbox(
            lat=listCoords["Lat"],
            lon=listCoords["Lon"],
            mode="markers",
            hoverinfo="text + lat + lon",
            text=listCoords.index.hour,
            marker=dict(
                showscale=True,  
                color=np.append(np.insert(listCoords.index.hour, 0, 0), 23),
                opacity=0.5,
                size=5,
                colorscale=[
                    [0, "#F4EC15"],
                    [0.04167, "#DAF017"],
                    [0.0833, "#BBEC19"],
                    [0.125, "#9DE81B"],
                    [0.1667, "#80E41D"],
                    [0.2083, "#66E01F"],
                    [0.25, "#4CDC20"],
                    [0.292, "#34D822"],
                    [0.333, "#24D249"],
                    [0.375, "#25D042"],
                    [0.4167, "#26CC58"],
                    [0.4583, "#28C86D"],
                    [0.50, "#29C481"],
                    [0.54167, "#2AC093"],
                    [0.5833, "#2BBCA4"],
                    [1.0, "#613099"],
                ],
                colorbar=dict(
                    title="Time of<br>Day",
                    x=0.93,
                    xpad=0,
                    nticks=24,
                    tickfont=dict(color="#d8d8d8"),
                    titlefont=dict(color="#d8d8d8"),
                    thicknessmode="pixels",
                ),
            ),
        ),

EDIT 1: providing sample data so people can run it:

List of some sensor detections with their date/time stamp:

**Date/Time	         Lat 	             Lon**
2019-03-25 00:05:00	-10,80948998827914	24,19160777427344  
2019-03-25 00:10:00	-10,79868405083584	24,16288145431259
2019-03-25 04:05:00	-10,78688335083584	24,20288145431259
2019-03-25 04:05:00	-10,77558405083584	24,288145431259

List of zones and their risk probability:

ZoneRisk_Prob          Zone
0	                    1
0	                    2
0,002394936420140275	3
0,030364372469635626	4
0,00005702229571762559	5
0	                    6
0,039345384045161656	7
0,10164224211666761	    8
0,14854308034441466	    9
0,0037064492216456633	10
0	                    11
0	                    12
0,0003421337743057536	13
0,1214289787306837	    14
0,04410674573758339	    15
0	                    16
0	                    17
0,0158236870616411	    18
0	                    19
0,18951359981752866	    20
0,0014825796886582653	21
0,0005417118093174431	22
0,027769858014483662	23
0,014027484746535895	24
0,0012259793579289502	25
0,029737127216741745	26
0,009636767976278725	27
0,060072988538518564	28
0,043051833266807324	29
0,005759251867480185	30
0,1094257854821235	    31

EDIT:

  • First I categorized/converted all the risk_probabilities into ‘1’, ‘2’ and ‘3’. Where 3 is highest risk.
  • Then I, Synchronized Dataset (basically bringing both datesets into alignment into one file)

new dataset threat_points.csv:

Date/Time                     Lat,                              Lon,                              Threat
2019-03-23 04:00:00,   -14.809489988279145,  26.191607774273443,    1
2019-03-23 04:00:00,   -14.792921094981814,  26.191716715339687,    2
2019-03-23 04:05:00,   -14.798684405083584,  26.162881454312586,    3
2019-03-23 04:10:00,   -14.80112670820822,    26.173830400821103,    3

Then based on the code-pointers from @empet, I set the following items:

# Initialize data frame
df1 = pd.read_csv(
     "/Users/ME/Desktop/DSP_Frontend/threat_points.csv",
    dtype=object,
)
df = pd.concat([df1], axis=0)
df["Date/Time"] = pd.to_datetime(df["Date/Time"], format="%Y-%m-%d %H:%M")
df.index = df["Date/Time"]
df.drop("Date/Time", 1, inplace=True)

#########################################################
##################### FACTOR 1 ##########################
#########################################################

# Take from df1 file the values of column 'Threat'
probs = df1['Threat'].values

# Convert the string values to integer in new list
probs1 = np.asarray(probs, dtype = int)

#  Filter only the high priority items which are equal to 3.
r = np.where(probs1 == 3)[0]

# Print check the possible locations of poachers
print("Factor 1 (risk probability) = SUCCESS")

#########################################################
##################### FACTOR 2 ##########################
#########################################################

##extract the list of datetimes between two fixed hours:#
time_red = df.between_time('01:00', '05:00').index

# # Print check the times
# print("At these timestamps: (without rows_nr) ",time_red)
print("Factor 2 (DateTime Range) = SUCCESS")

#get the row number in df.index of each element in time_red
row_nr = [list(df.index).index(tr) for tr in time_red]

# #extract the common elements in r and row_nr:
red_position = set(r).intersection(set(row_nr))
print("Factor 3 (Find Intersection between F1 and F2) = SUCCESS")

print(red_position)

This outputs row numbers:
{15268, 15422, 24713, 14667, 21080, 11928, 33136, 35219, 35220, 17716, 35222, 35223, 35224, 14681, 35226, 35227, 35228, 158}

Now coming to the conditional styling, this is what I have in mind:

return go.Figure(
        data=[
            # Data for all rides based on date and time
            Scattermapbox(
                lat=listCoords["Lat"],
                lon=listCoords["Lon"],
                mode="markers",
                hoverinfo="text + lat + lon",
                text=listCoords.index.hour,
                marker=dict(
                    showscale=True,
                    color=np.where(np.logical_if(red_position, else), 'red', np.append(np.insert(listCoords.index.hour, 0, 0), 23)),
                    opacity=0.5,
                    size=5,
                    colorscale=[
                        [0, "#F4EC15"],
                        [0.04167, "#DAF017"],
                        [0.0833, "#BBEC19"],
                        [0.125, "#9DE81B"],
                        [0.1667, "#80E41D"],
                        [0.2083, "#66E01F"],
                        [0.25, "#4CDC20"],
                        [0.292, "#34D822"],
                        [0.333, "#24D249"],
                        [0.375, "#25D042"],
                        [0.4167, "#26CC58"],
                        [0.4583, "#28C86D"],
                        [0.50, "#29C481"],
                        [0.54167, "#2AC093"],
                        [0.5833, "#2BBCA4"],
                        [1.0, "#613099"],
                    ],
                    colorbar=dict(
                        title="Time of<br>Day",
                        x=0.93,
                        xpad=0,
                        nticks=24,
                        tickfont=dict(color="#d8d8d8"),
                        titlefont=dict(color="#d8d8d8"),
                        thicknessmode="pixels",
                    ),
                ),
            ),

Posts: 7

Participants: 2

Read full topic


Viewing all articles
Browse latest Browse all 6271

Trending Articles