[BUG]: Table string cells render as NaN when cells.format is set before initial render, but Plotly.restyle renders correctly
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 18.8k
- Forks
- 2.8k
- Avg merge
- 16h 26m
- Merged PRs (30d)
- 21
Description
Description
When initializing a Plotly go.Table with string cell values such as
"rgb(239, 243, 255)" and setting cells.format=[1] before the first render, the
string values are displayed as NaN.
However, if the same base table is rendered first and the same cells.format value
is then applied dynamically through Plotly.restyle, the table displays the original
string values correctly.
The setting is accepted by plotly.py and stored on the trace object, so this looks
like an initial-render formatting/coercion discrepancy in table traces rather than an
invalid Python-side property assignment.
Screenshots/Video
Steps to reproduce
import io
import plotly
import plotly.graph_objects as go
import plotly.io as pio
from PIL import Image, ImageChops
from playwright.sync_api import sync_playwright
print(f"Plotly version: {plotly.__version__}")
fig = go.Figure(
go.Table(
header={"values": ["Color"]},
cells={"values": [["rgb(239, 243, 255)", "rgb(8, 81, 156)"]]},
)
)
# Screenshot 1 / plot1.png: set cells.format in Python before the initial render.
fig.data[0].cells.format = [1]
assert fig.data[0].cells.format == (1,)
print("Python-side cells.format:", fig.data[0].cells.format)
html1 = pio.to_html(fig, full_html=True, include_plotlyjs="cdn")
# Screenshot 2 / plot2.png: render first, then apply the same value with JS.
fig.data[0].cells.format = None
html2 = pio.to_html(fig, full_html=True, include_plotlyjs="cdn")
html2 = html2.replace(
"</body>",
"""
<script>
window.addEventListener("DOMContentLoaded", () => {
const plotEl = document.getElementsByClassName("plotly-graph-div")[0];
setTimeout(() => {
Plotly.restyle(plotEl, {"cells.format": [1]}, [0]);
}, 1000);
});
</script>
</body>""",
)
with sync_playwright() as playwright:
browser = playwright.chromium.launch(
headless=True,
args=["--no-sandbox", "--disable-dev-shm-usage", "--disable-gpu"],
)
page = browser.new_page(viewport={"width": 1200, "height": 800})
page.set_content(html1)
page.wait_for_timeout(1500)
img1 = page.screenshot(path="plot1.png")
page.set_content(html2)
page.wait_for_timeout(2000)
img2 = page.screenshot(path="plot2.png")
browser.close()
diff = ImageChops.difference(
Image.open(io.BytesIO(img1)).convert("RGB"),
Image.open(io.BytesIO(img2)).convert("RGB"),
)
print("Saved plot1.png and plot2.png")
assert diff.getbbox() is not None, "Reproducer did not reproduce: images are identical."
Notes
Add info here that doesn't fit in the other sections.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Run the supplied Python and Playwright reproducer first, comparing the initial render with the later Plotly.restyle path. Trace how table cells.format is handled during initial rendering versus restyle, and consider the issue done when string cell values render identically in both cases.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript, python
- Domain
- data-visualization, frontend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100