Постоянное обновление карты рассеяния - символы не меняютсяPython

Программы на Python
Ответить
Anonymous
 Постоянное обновление карты рассеяния - символы не меняются

Сообщение Anonymous »

Используя график, я хочу отобразить на карте серию символов в реальном времени.
Рассмотрим следующее:

Код: Выделить всё

import threading, datetime, dash, time
from dash import dcc, html, dash_table, Patch
from dash.dependencies import Input, Output, State
from plotly.subplots import make_subplots
import plotly.express as px
import plotly.graph_objs as go

class PlotlyApp(threading.Thread):
def __init__(self):
super().__init__(name='PlotlyApp')
self.toggle = False
self.toggle_time = datetime.datetime.now(datetime.timezone.utc)
self.loc_x, self.loc_y = 50, -50

def run(self):
app = dash.Dash(__name__)

self.fig = go.Figure()
self.fig.add_scattermap(lat=[self.loc_x], lon=[self.loc_y])
self.fig.add_scattermap()
self.fig.update_layout(
uirevision=True,
map_style="open-street-map",
map_zoom=18,
map_center_lat = self.loc_x,
map_center_lon=self.loc_y,
margin={"r": 5, "t": 0, "l": 5, "b": 0},
)
app.layout = html.Div([
dcc.Graph(
id='graph',
figure=self.fig,
style={"height": '85vh'},
animate=True,
# config={'responsive':True}
),
dcc.Interval(
id='interval',
interval=1000,  # update every 1 second
disabled=False
),
# style={"height": '100vh'}
]),

@app.callback(
Output('graph', 'figure'),
[Input('interval', 'n_intervals')],
# prevent_initial_call=True,
)
def _graph(*args):
now = datetime.datetime.now(datetime.timezone.utc)
changes_x, changes_y = [], []
if now > (self.toggle_time + datetime.timedelta(seconds=10)):
self.toggle = not self.toggle
self.toggle_time = now
print('toggle {}'.format(self.toggle))
if self.toggle:
x1 = self.loc_x - 0.0001
x2 = self.loc_x + 0.0001
y1 = self.loc_y - 0.0001
y2 = self.loc_y + 0.0001
changes_x.extend([
x1,
x2,
x1,
x2
])
changes_y.extend([
y1,
y2,
y2,
y1
])

with self.fig.batch_update():
self.fig.data[1].lat = changes_x
self.fig.data[1].lon = changes_y
self.fig.update_annotations(overwrite=True)
self.fig.update_geos(overwrite=True)
self.fig.update_layout(overwrite=True)
self.fig.update_layout_images(overwrite=True)
self.fig.update_mapboxes(overwrite=True)
self.fig.update_maps(overwrite=True)
self.fig.update_shapes(overwrite=True)
self.fig.update_traces(overwrite=True)
self.dt_update = now
return self.fig
app.run(debug=True, use_reloader=False, dev_tools_ui=True)

if __name__ == "__main__":
pa = PlotlyApp()
pa.run()
while True:
time.sleep(1)
Работа, показывающая, что приложение работает на локальном хосте; при переходе по адресу открывается карта с синей точкой в ​​центре.
Как видно из сценария, каждые десять секунд набор точек вокруг синей точки добавляется, а затем удаляется (также распечатывается «переключение true/false»). Однако визуально это не отображается.
Если обновить веб-страницу при отсутствии окружающих объектов, будет видна только синяя точка, и больше ничего не появится. Если обновить веб-страницу, пока существуют окружающие точки, вокруг синей точки будет виден набор красных точек... но они никогда не исчезнут (даже когда основные данные исчезнут).
Примечательно то, что если вы подведете указатель мыши к красным точкам, пока есть данные, появится текст при наведении, а когда основные данные будут очищены, текст при наведении перестанет отображаться. Но на красные точки это не влияет.
Кто-нибудь знает, почему это происходит и как добиться желаемого поведения?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»