to_typed_array_spec encodes bdata in host byte order; plotly.js always decodes it as little-endian
Mantenedores costumam responder em até 3 dias
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 79/100
- Tipo de issue
- Bug
- Clareza
- Claramente especificada
- Status de atividade
- Ativa
- Stack de tecnologia
- numpy, python
- Domínio
- backend, data-visualization
Direção de pesquisa
Comece em _plotly_utils/utils.py, em to_typed_array_spec (por volta da linha 84), e acompanhe como o dtype do array é selecionado e como seus bytes são codificados. Verifique o comportamento com arrays little-endian e big-endian, incluindo a reprodução fornecida. O trabalho estará concluído quando os dados codificados forem decodificados como little-endian e resultarem nos valores numéricos originais, com um teste de regressão cobrindo o caso relatado.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Summary
to_typed_array_spec (_plotly_utils/utils.py:84) does:
arrObj = {
"dtype": plotlyjsShortTypes[dtype],
"bdata": base64.b64encode(v).decode("ascii"),
}
with no explicit byte-order normalization before encoding, so bdata follows whatever byte order the array's dtype naturally has, which for an array built without an explicit </> prefix is the host's native order.
plotly.js decodes bdata with new Float64Array(buffer), which always reads in the platform's native order, little-endian in every real browser. On a big-endian host, this means bdata ships bytes that no browser can read correctly.
Repro (confirmed on real big-endian hardware: z/OS/s390x, numpy 2.5.3)
Through the actual function, not just a standalone simulation:
import numpy as np
from _plotly_utils.utils import to_typed_array_spec
v = np.array([1.1, 2.3, 3.5])
spec = to_typed_array_spec(v)
print(spec)
import base64
raw = base64.b64decode(spec["bdata"])
as_little = np.frombuffer(raw, dtype="<f8") # what plotly.js's Float64Array reads
print("decoded as browser Float64Array would read it:", as_little)
print("matches original:", np.array_equal(v, as_little))
Output:
{'dtype': 'f8', 'bdata': 'P/GZmZmZmZpAAmZmZmZmZkAMAAAAAAAA'}
decoded as browser Float64Array would read it: [-1.54234871e-180 1.90359857e+185 1.54938987e-320]
matches original: False
So any big-endian host produces charts with silently corrupted numeric data.
Suggested fix
Normalize v to little-endian before encoding, e.g. v = v.astype(v.dtype.newbyteorder("<")) immediately before the base64.b64encode(v) call. Verified this resolves it on the same hardware:
v_fixed = v.astype(v.dtype.newbyteorder("<"))
bdata_fixed = base64.b64encode(v_fixed).decode("ascii")
raw_fixed = base64.b64decode(bdata_fixed)
as_little_fixed = np.frombuffer(raw_fixed, dtype="<f8")
print(np.array_equal(v, as_little_fixed)) # True
Originally spotted by @chrikrah in #5833;
- Linguagem predominante
- Python
- Estrelas
- 18.9k
- Forks
- 2.9k
- Merge médio
- 5d 1h
- PRs com merge (30d)
- 14
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de plotly/plotly.py
-
[BUG]: NaT inside a datetime64 array serializes as the string "NaT" instead of nullTalvez já em andamento @senanurcetin assumiu há 3 dias. Abertabug P3 size: 1
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
plotly/plotly.py#5829 · 3 comentários ·
Mantenedores costumam responder em até 3 dias
-
[BUG]: Integer and string properties reject NumPy scalarsTalvez já em andamento @RaphaelFakhri assumiu há 4 dias. Abertabug P3 size: 1
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
plotly/plotly.py#5827 · 1 comentário ·
Mantenedores costumam responder em até 3 dias
-
[BUG]: Single-color requests raise ZeroDivisionError in palette helpersTalvez já em andamento @MokiMeow assumiu há 13 dias. Abertabug P3 size: 1
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
plotly/plotly.py#5805 · 1 comentário ·
Mantenedores costumam responder em até 3 dias
-
[BUG]: Unnecessary `UserWarning` when using `fig.write_image()` with `kaleido.start_sync_server()`Talvez já em andamento @jayzhou2309 assumiu há 21 dias. Abertabug P3 size: 1
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
plotly/plotly.py#5786 · 1 comentário ·
Mantenedores costumam responder em até 3 dias
-
P3 size: 1 task
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
plotly/plotly.py#5769 · 1 reação ·
Mantenedores costumam responder em até 3 dias
Todas as issues de plotly/plotly.py
Issues semelhantes
-
style: article/section 📝 system: cloud.rc ☁️ system: security 🔐
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
uabrc/uabrc.github.io#1262 ·
-
documentation
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
NCAR/miles-credit#526 ·
-
documentation
Dificuldade 1/5 1-3 horas Facilidade para iniciantes 76/100
conda/conda-lock#957 ·
Mantenedores costumam responder em até 1 dia
-
Type: Bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
aws-samples/sample-per-model-bedrock#464 ·
Mantenedores costumam responder em até 1 dia