plotly / plotly/plotly.py

R ggplotly to Python plotly conversion issues (with beginnings of a possible fix)

Open
#4,410 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

community feature P2
Dominant language
Python
Stars
18.8k
Forks
2.8k
Avg merge
16h 26m
Merged PRs (30d)
21

Description

Hello Plotly team! I want to make graphs in R’s ggplotly and then run existing Plotly Python code to reformat them. However, I’m getting errors when importing a ggplotly JSON created in R into Plotly in Python.

To fix these errors, I have to resort to either running code to fix them in the JSON (2a below) or setting pio.read_json()’s skip_invalid parameter to true (2b below). , I believe the JSON is valid because 1) The JSON renders correctly in Plotly.js 2) The JSON comes from simple graphs made in ggplotly.

R code:

library(ggplot2)
library(plotly)

# Data
a = data.frame(x = (0:4), y = c(2, 4, 1, 6, 8), group="A")
b = data.frame(x = (0:4), y = c(3, 2, 5, 4, 7), group="B")
data <- rbind(a, b)

# Graph 
fig <- ggplot(data, aes(x, y, color = group)) + geom_line()

#Convert to ggplotly, save as JSON, and export
fig_ggplotly <- ggplotly(fig)
fig_ggplotly_json<-plotly_json(fig_ggplotly, FALSE)
write(fig_ggplotly_json,'fig_ggplotly.json')

2a: Python code - Errors when using json.load( )

import json
import sys

with open(“fig_ggplotly.json", "r") as f:
    fig_ggplotly_json = json.load(f)
print(fig_ggplotly_json)

go.Figure(fig_ggplotly_json) # throws errors; solved with ggplotly_to_plotly.py 

 # Example of invalid parameter:  
fig_ggplotly_json['layout']['font']['family'] # shows value as ‘’. Does not throw error.

2b: Python code - Using pio.read_json() with skip_invalid=True

import json
import sys
import plotly.io as pio

with open("fig_ggplotly.json", "r") as f:
    fig_ggplotly_pio = pio.read_json(f, skip_invalid=True)

# Example of invalid parameter that gets completely eliminated using skip_invalid, causing later issues:   
fig_ggplotly_pio.to_dict()['layout']['font']['family'] #throws KeyError

Skipping elements of the JSON seems to be inviting a loss of fidelity. Indeed, the reformatting code I apply has issues handling some elements due to the skipped invalid parameters. I’ve identified a number of specific elements that are not compatible with Plotly.py and would appreciate it if Plotly.py were to handle this valid input correctly. The ggplotly_to_plotly conversion code, which highlights many of the problem areas for basic graphs, can be found here.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the supplied R ggplotly export and importing it with Python's pio.read_json() and go.Figure(). Read the linked ggplotly_to_plotly.py gist for the identified incompatibilities. Done means compatible ggplotly JSON imports without skip_invalid=True while preserving fields such as layout.font.family.

Written by the indexing model from the issue text.

Assessment

Tech stack
python, r
Domain
data-visualization
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.