2

I'm trying to recreate the world Choropleth map given in plotlys example page here: https://plot.ly/python/choropleth-maps/ with the intention of reusing some of the code, but changing the column which informs the shadings and the labelling.

However when I run the exact code given in the example I receive the following error.

plotly.exceptions.PlotlyError: Because you didn't supply a 'file_id' in the call, we're assuming you're trying to snag a figure from a url. You supplied the url, '', we expected it to start with 'https://plot.ly'. Run help on this function for more information.

I have no idea where this error arises from and my question really is how do I adapt the code so that it produces the said figure offline? Secondly is there a simple method for saving the figure directly to a png? Apologies if this is trivial I'm completely new to the package.

Here is the code:

import plotly.plotly as py
import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2014_world_gdp_with_codes.csv')
data = [dict(
    type='choropleth',
    locations=df['CODE'],
    z=df['GDP (BILLIONS)'],
    text=df['COUNTRY'],
    colorscale=[[0, "rgb(5, 10, 172)"], [0.35, "rgb(40, 60, 190)"], [0.5, "rgb(70, 100, 245)"],\
                [0.6, "rgb(90, 120, 245)"], [0.7, "rgb(106, 137, 247)"], [1, "rgb(220, 220, 220)"]],
    autocolorscale=False,
    reversescale=True,
    marker=dict(
        line=dict(
            color='rgb(180,180,180)',
            width=0.5
        )),
    colorbar=dict(
        autotick=False,
        tickprefix='$',
        title='GDP<br>Billions US$'),
)]

layout = dict(
    title='2014 Global GDP<br>Source:\
            <a href="https://www.cia.gov/library/publications/the-world-factbook/fields/2195.html">\
            CIA World Factbook</a>',
    geo=dict(
        showframe=False,
        showcoastlines=False,
        projection=dict(
            type='Mercator'
        )
    )
)

fig = dict(data=data, layout=layout)
py.iplot(fig,validate=False, filename='d3-world-map')
EFZ
  • 147
  • 3
  • 12

1 Answers1

1

You need to import the offline specific functions, which allow you to plot inline in a jupyter notebook:

import plotly.figure_factory as ff
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)

# All of your code
# ....

# Just change the last line from py.iplot to iplot
iplot(fig,validate=False, filename='d3-world-map')

enter image description here

This renders the image inline in a jupyter notebook, and there's a button that allows you to Download plot as a png in the upper right, along with other functionality.


If you need to save the image as a png, you can try changing the last line to:

plot(fig, validate=False, filename='d3-world-map.html', image='png')

This actually creates an .html file and will open a browser. You can then manually save this as a .png. The last step can be automated with other libraries like selenium, but not sure there is a simple way around it given their documentation:

Note that you must generate the graph and open the file to save the image.

ALollz
  • 57,915
  • 7
  • 66
  • 89
  • Thanks for your response, firstly I'm running this out of pycharm, I'm not sure if that affects things. Secondly, do you mind explaining how that would fit into the specific code example I provided? – EFZ Oct 25 '18 at 13:55
  • @EliotFZ, I updated the solution, let me know if that's still not sufficient, I can try to find a better way to save the image – ALollz Oct 25 '18 at 14:06
  • Thanks for your answer, the saving of the image is still a sticking point: for some reason when I use pio.write_image(fig, 'fig1.png'), which according to their site should do the trick I recieve errors : namely "ValueError: Invalid property specified for object of type plotly.graph_objs.choropleth.ColorBar: 'autotick'" which is strange. Let me know if you have any advice. – EFZ Oct 25 '18 at 15:29