MSD
MSD

Reputation: 161

How to define conditional statement for colour of scatterplot dots based on two factors?

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:

Intended condition for coloring:

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

My 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.

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

return go.Figure(
    data=[
        # Data for all observations based on date/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

Upvotes: 1

Views: 498

Answers (1)

MSD
MSD

Reputation: 161

To get the positions that meet both your requirements you should proceed as below.

Read the two data files, that are supposed to be syncronized, in the sense that datetime recorded in the row k of the datetime file, corresponds to the location of coords (lon, lat) in the row number k of the other file.

dfz = pd.read_csv("zone-file.csv")
probs = dfz['ZoneRisk_Prob'].values
I = np.where(probs > 0.6)[0]
print(I)
dft = pd.read_csv("record-datetime.csv") #supose that this dataframe has Date/Time as index

#extract the list of datetimes between two fixed hours:

time_red = dft.between_time('01:00', '05:00').index
print(time_red)

#get the row number in dft.index of each element in  time_red

row_nr = [list(df.index).index(tr) for tr in time_red]
print(row_nr)

#extract the common elements in I and row_nr:

red_position = set(I).intersection(set(row_nr))

If, for example, red_position =[ 7,12, 17, 25], then color[7], color[12], color[17], color[25] will be red

Upvotes: 1

Related Questions