【问题标题】:How to define conditional statement for colour of scatterplot dots based on two factors?如何根据两个因素定义散点图点颜色的条件语句?
【发布时间】:2020-01-17 08:07:34
【问题描述】:

这周我开始学习 Python 和 Dash,因为我很想同时学习这两种语言。

我的目标: 我想挑出传感器检测到的某些点,如果它们满足两个条件,则将它们涂成红色

  • 如果在上午 01:00-05:00 之间检测到它们
  • 如果在某个区域检测到它们(假设我有一个列表 每个区域的风险概率)。所以它也应该考虑任何大于 0.6 的风险。

着色的预期条件:

IF x > 1 AND x 0.6 THEN color=red, ELSE listCoords.index.hour

我的问题: 我的代码中的color=np.append(np.insert(listCoords.index.hour, 0, 0), 23) 部分必须如何更改才能达到我的目标?我在想一些事情(不包括风险清单):

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')

但这不起作用。非常感谢任何帮助。

我的代码片段:地理地图上的点分散:

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",
                ),
            ),
        ),

编辑 1:提供示例数据以便人们可以运行它:

一些传感器检测及其日期/时间戳的列表:

**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

区域列表及其风险概率:

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

【问题讨论】:

  • 我对@9​​87654327@ 没有任何经验。但是,这对于matplotlib 来说非常简单。也许它的工作方式相同?在matplotlib 中,您可以通过将颜色列表(由ints 表示)传递给像plt.scatter(x,y,c=[1,2,3,...]) 这样的散布方法来为每个特定点定义特定颜色。我创建了一个repl.it 向您展示。我也会自己尝试看看它是否可以转移到plotly

标签: python conditional-statements conditional-formatting plotly-dash


【解决方案1】:

要获得同时满足您要求的职位,您应该按照以下步骤进行。

读取两个应该被同步的数据文件,在这个意义上 datetime文件第k行记录的datetime,对应其他文件第k行coords(lon,lat)的位置。

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))

例如,如果 red_position =[ 7,12, 17, 25], 那么 color[7], color[12], color[17], color[25] 将变为红色

【讨论】:

    猜你喜欢
    • 2013-10-08
    • 2019-09-28
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多