Plotly:绘制 (n) 个点时标记消失

Pet*_*tar 4 python plot python-3.x plotly plotly-python

好的,所以我最初的想法是在绘图中绘制一个线图,并在特定阈值 t 之后用一种颜色为线着色,在阈值之前用另一种颜色为线着色。它适用于 23 或更少的点,但它适用于更多点,使用以下方法:

import numpy as np
import plotly.graph_objects as go

X = [j for j in range(0, 100)]
Y = [j for j in range(100000, 200000, 1000)]
X = X[:23]
Y = Y[:23]
X = np.array(X)
Y = np.array(Y)
t = 4

x = X[X <= t]  # Include the threshold
y = Y[X <= t]
bx = X[X >= t]
by = Y[X >= t]

fig = go.Figure()
fig.add_trace(go.Scatter(x=x, y=y, line=dict(width=4, color='grey'), name="useless data"))
fig.add_trace(go.Scatter(x=bx, y=by, line=dict(width=4, color='blue'), name="useful data"))
fig.update_layout(xaxis_title="x axis", yaxis_title="y axis")
fig.show()
Run Code Online (Sandbox Code Playgroud)

所以这可以正常工作,如果你运行它,你会看到 4 包含在蓝点中。但现在,请删除仅采用 23 个值的行 ( X = X[:23], Y = Y[:23])。您会看到4不再是蓝色点的一部分,而且这些点本身从图表中的蓝色线中消失,您可以将鼠标悬停并查看数据,但看不到实际的点!如果有人知道为什么会发生这种情况,这是一个真正的错误还是正常行为,我缺少什么?先感谢您!

ves*_*and 7

漏洞?不必要。行为奇怪?也许...

无论如何,您的情况的解决方案是:

fig.data[1].mode = 'lines+markers'
Run Code Online (Sandbox Code Playgroud)

您似乎在这里遇到的困难是由两件事引起的:

  1. 当鼠标悬停在一个点上时,该点有一条由一条线表示的迹线,一条迹线由一个标记表示,即使该线位于顶部,plotly 也会显示该标记的信息。
  2. 对于不断增加的迹线长度go.Scatter(),在达到某个阈值后,plotly 将停止显示标记。
  3. 这也许是最奇怪的部分;确切的阈值似乎不仅仅由迹线的长度决定。我们最后会看看这个。

细节:


1. 悬停行为

只需按原样运行您的代码,然后将鼠标悬停在4

在此输入图像描述

现在useless data通过单击图例中的名称取消选择,您将得到:

在此输入图像描述

如果放大一点,您会看到数据实际上在那里,只是当两条跟踪都被激活时,它不会在悬停时显示:

在此输入图像描述

那么,该怎么办呢?

只需包括:

fig.data[1].mode = 'lines+markers'
Run Code Online (Sandbox Code Playgroud)

并得到:

在此输入图像描述

2. 标记触发阈值go.Scatter

在您的情况下,这个阈值似乎是长度= 23 的跟踪,因为您看到了您所描述的确切行为。那么,这有什么奇怪的呢?下一部分:

3.改变标记触发阈值

首先,*为什么会有门槛?可能是因为带有太多标记的痕迹看起来很奇怪:

在此输入图像描述

您发现阈值是 24。但在仅使用 构建的图中go.Figure(go.Scatter(x = x, y = y)),阈值是 20:

pts = 20
x = np.arange(1,pts)
y = np.arange(1,pts)
fig = go.Figure(go.Scatter(x = x, y = y)).show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

pts = 21
x = np.arange(1,pts)
y = np.arange(1,pts)
fig = go.Figure(go.Scatter(x = x, y = y)).show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我不知道为什么。但我认为这本身就是一个很好的问题。