Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python plotly date axis as string not dates

Tags:

python

plotly

I want to create a bar chart using python plotly, with on the x-axis dates as strings/categories. For some reason, plotly keeps transforming strings to dates. My x-axis is continuous "timeline" of dates, rather than categories as I would expect.

My question: how can I construct a bar chart where my dates are handled as categories, rather than dates?

Minimal example:

d = {'date': ['2018-08-04', '2018-08-02','2018-08-03', '2018-08-11','2018-08-11'], 'score': [3, 4, 6, 2,8]}
df = pd.DataFrame(data=d)

data = [go.Bar(
            x=df['date'],
            y=df['score']
    )]

offline.iplot(data, filename='basic-bar')

Example:

enter image description here

like image 973
Vicky Avatar asked Mar 05 '23 08:03

Vicky


2 Answers

You can specify the axis type in your layout settings. Plotly autodetects dates but you can overwrite it by setting type='category'.

enter image description here

import pandas as pd
import plotly

plotly.offline.init_notebook_mode()

d = {'date': ['2018-08-04', '2018-08-02','2018-08-03', '2018-08-11','2018-08-11'], 
     'score': [3, 4, 6, 2,8]}
df = pd.DataFrame(data=d)

data = plotly.graph_objs.Bar(x=df['date'],
                             y=df['score'])

#the magic happens here
layout = plotly.graph_objs.Layout(xaxis={'type': 'category'})

fig = plotly.graph_objs.Figure([data], layout)
plotly.offline.iplot(fig)
like image 74
Maximilian Peters Avatar answered Mar 16 '23 07:03

Maximilian Peters


Reading the documentation about date formatting and time series, it seems like plotly automatically converts data that is formatted as a date... to a date.

  1. You should reformat your data, such as '2018-08-04' becomes '2018/08/04' for instance. But you would have a more basic bar plot, meaning the X intervals wouldn't look as nicely formatted as it is now.

  2. You can always rename the x-axis manually, but it might be overkill for what you're trying to do. To do this, I suggest you do pd.date_range() so that you're getting a list of dates with plotly date format, then, manually set the x labels.

like image 30
IMCoins Avatar answered Mar 16 '23 06:03

IMCoins