Нужно обновлять данные графика heatmap библиотеки plotly на python по нескольким параметрам данных с помощью выпадающих списков.
Пробовал такой код.
import numpy as np
import plotly.graph_objects as go
data = {
str(i): dict(zip(['div', 'mod'], np.divmod(np.arange(6).reshape(2, 3), i)))
for i in (2, 3)
}
class HeatMap():
def __init__(self, data):
self.data = data
self.arg = '2'
self.op = 'div'
self.cats = ['arg', 'op']
self.args = ['2', '3']
self.ops = ['div', 'mod']
@property
def z(self):
return self.data[self.arg][self.op]
@property
def title(self):
return f'{self.op} {self.arg}'
@property
def text(self):
return self.z.astype(object)
def get_args(self, **kwargs):
for cat in self.cats:
setattr(self, cat, kwargs.get(cat, getattr(self, cat)))
return [
{'z': [self.z]},
{'text': self.text},
{'title': self.title}
]
def get_buttons(self, cat):
return [
{
'label': str(sign),
'method': 'update',
'args': self.get_args(**{cat: sign})
}
for sign in eval(f'self.{cat}s')
]
def plot(self):
fig = go.Figure()
fig.add_trace(
go.Heatmap(
z=self.z,
y=[0, 1],
x=[0, 1, 2],
text=self.text,
texttemplate='%{text}',
zmax=2,
zmin=0,
showscale=True
)
)
fig.update_layout(
title=self.title,
width = 600,
height = 400,
autosize = False
)
fig.update_layout(
updatemenus=[
{
'buttons': [
{
'label': str(sign),
'method': 'update',
'args': self.get_args(**{cat: sign})
}
for sign in eval(f'self.{cat}s')
],
'direction': 'down',
'pad': {'r': 0, 't': 0, 'l': 0, 'b': 0},
'showactive': True,
'x': [0, 0.22][i],
'xanchor': 'left',
'y': 1.12,
'yanchor': 'top'
}
for i, cat in enumerate(self.cats)
]
)
fig.show()
hm = HeatMap(data)
hm.plot()
Как видите, результаты неадекватны данным.
Данные arg = 2, op = ‘mod’, вообще, не отображаются никаким выбором параметров. Остальные варианты получаются, но text не совпадает с данными z?
Не могу понять почему. Какие есть варианты решения этой задачи?
New contributor
Василий Гурьев is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.