Python 打印:打印(n)个点时标记消失

Python 打印:打印(n)个点时标记消失,python,python-3.x,plot,plotly,plotly-python,Python,Python 3.x,Plot,Plotly,Plotly Python,好的,我最初的想法是用plotly做一个线图,在某个阈值t之后用一种颜色给线上色,在阈值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)

好的,我最初的想法是用plotly做一个线图,在某个阈值t之后用一种颜色给线上色,在阈值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()
将numpy导入为np
导入plotly.graph_对象作为go
X=[j代表范围(01000)内的j]
Y=[j代表范围内的j(100000、200000、1000)]
X=X[:23]
Y=Y[:23]
X=np.数组(X)
Y=np.数组(Y)
t=4
x=x[x=t]
图=go.Figure()
图添加轨迹(go.Scatter(x=x,y=y,line=dict(width=4,color='grey'),name=“无用数据”))
图添加轨迹(go.Scatter(x=bx,y=by,line=dict(width=4,color='blue'),name=”有用数据”))
图更新布局(x轴,y轴)
图2(图3)
所以这是正常工作的,如果你运行它,你会看到蓝点中包含了4。但是现在,请删除只获取23个值的行(
X=X[:23],Y=Y[:23]
)。您将看到4不再是蓝点的一部分,而且,蓝线中的点本身从图形中消失,您可以悬停并查看数据,但无法查看实际点!如果有人知道为什么会发生这种情况,这是一个真正的错误还是正常的行为,我遗漏了什么?提前谢谢你

原因是: 这是绘图散点图的一个“特征”。打印(多个)点时,基本的Plotly逻辑会将“散点”打印转换为“直线”打印,以提高渲染效率和打印清洁度。因此,标记将转换为实线

修复方法: 只需将
mode='lines+标记'
添加到跟踪

完整工作示例: 这是您的源代码,带有上面提到的次要修复:

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, mode='lines+markers', line=dict(width=1, color='grey'), name="useless data"))
fig.add_trace(go.Scatter(x=bx, y=by, mode='lines+markers', line=dict(width=1, color='blue'), name="useful data"))
fig.update_layout(xaxis_title="x axis", yaxis_title="y axis")
fig.show()
将numpy导入为np
导入plotly.graph_对象作为go
X=[j代表范围(01000)内的j]
Y=[j代表范围内的j(100000、200000、1000)]
#X=X[:23]
#Y=Y[:23]
X=np.数组(X)
Y=np.数组(Y)
t=4
x=x[x=t]
图=go.Figure()
图添加轨迹(去散点(x=x,y=y,mode='lines+markers',line=dict(width=1,color='grey'),name=“无用数据”))
图添加轨迹(go.Scatter(x=bx,y=by,mode='lines+markers',line=dict(width=1,color='blue'),name=“有用数据”))
图更新布局(x轴,y轴)
图2(图3)
输出:

臭虫?不一定。奇怪的行为?也许。。。 在任何情况下,您的解决方案都是:

fig.data[1].mode = 'lines+markers'

你在这里挣扎的原因有两个:

  • 当鼠标悬停在一个点上,其中一条轨迹由直线表示,另一条轨迹由标记表示时,即使直线位于顶部,plotly也会显示标记的信息
  • 对于越来越长的
    go.Scatter()
    trace,plotly将在特定阈值后停止显示标记
  • 这也许是可以说是奇怪的部分;确切的阈值似乎不仅仅由跟踪的长度决定。最后我们会看一看

  • 细节:
    1.悬停行为 只需按原样运行代码,并将鼠标悬停在
    4

    现在,通过单击图例中的名称取消选择“无用数据”,您将获得:

    如果放大一点,您将看到数据实际上在那里,当两条记录道都被激活时,它不会显示在悬停状态:

    那么,该怎么办呢? 仅包括:

    fig.data[1].mode = 'lines+markers'
    
    并获得:

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


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

    Nice one(+1)比我快了大约45秒=D非常有用的答案!它节省了我很多时间!谢谢你和维斯特兰对我的帮助!非常感谢,祝你有一个美好的一天@佩塔-我的荣幸。很高兴听到这很有帮助。伟大的头脑。。。相隔几秒钟。很好的一个伴侣,扎实的努力和解释。(+1)@S3DEV!非常有用的答案!它节省了我很多时间!谢谢你和S3DEV对我的帮助!真的很感激,祝你有一个美好的一天!
    pts = 21
    x = np.arange(1,pts)
    y = np.arange(1,pts)
    fig = go.Figure(go.Scatter(x = x, y = y)).show()