Search code examples
pythonplotly

Plotly: How to get rid of the redundant xaxis ticks?


This is a program to read data from .xlsx file and plot a bubble diagram by utilizing Plotly library. Here is the raw data of the .xlsx file:

             1991  1992  1993  1994  1995  1996  1997  1998  1999
         US    10    14    16    18    20    42    64   100    50
      JAPAN   100    30    70    85    30    42    64    98    24
         CN    50    22    30    65    70    66    60    45    45
      INDIA    90    88    35    50    90    60    40    66    76
         UK    40    50    70    50    25    30    22    40    60

And here is the code:

# Version 2
import plotly as py
import plotly.graph_objs as go
import openpyxl
import pandas as pd


wb = openpyxl.load_workbook('grape output.xlsx')
sheet = wb['Sheet1']
row_max = sheet.max_row
col_max = sheet.max_column
first_row_list = []
first_col_list = []
for col_n in range(2, col_max+1):
    first_row_list.append(sheet.cell(row=1, column=col_n).value)
for row_n in range(2,row_max+1):
    first_col_list.append(sheet.cell(row=row_n, column=1).value)

data_all = pd.read_excel('grape output.xlsx')
data_selected = data_all.loc[:,first_row_list]

df = pd.DataFrame(data_selected)
df.index = first_col_list
colors = ['rgb(150,204,90)','rgb(255, 130, 71)','rgb(255, 193, 37)','rgb(180,240,190)','rgb(255, 10, 1)',
          'rgb(25, 19, 3)','rgb(100, 100, 100)','rgb(45,24,200)','rgb(33, 58, 108)','rgb(35, 208, 232)']

data = [go.Scatter(
    x=df.columns,
    y=[country]*len(df.columns),
    mode='markers+text',
    marker=dict(
        color=colors[num],
        size= df.loc[country],
        showscale = False,
        ),
    text=list(map(str, df.loc[country])),
    textposition='middle center',
    )
    for num, country in enumerate(reversed(df.index))
]

layout = go.Layout(plot_bgcolor='rgb(10, 10, 10)',
                   paper_bgcolor='rgb(20, 55, 100)',
                   font={
                       'size': 15,
                       'family': 'sans-serif',
                       'color': 'rgb(255, 255, 255)'
                   },
                   width=1000,
                   height=800,
                   xaxis=dict(
                       title='Output of grapes per year in different countries',
                       nticks = col_max+1,
                   ),
                   showlegend=False,
                   margin=dict(l=100, r=100, t=100, b=100),
                   hovermode = False,
                   )

fig = go.Figure(data=data, layout=layout)
py.offline.plot(fig, filename='basic-scatter.html')

The bubble diagram is plotted as the following: Bubble plot plotted Everything is ok except for the two redundant ticks for 1990 and 2000 as well as the two white vertical lines. How could I make some changes to get rid of them? Thank you!


Solution

  • If you set type='category' in the xaxis layout the two redundant ticks and the corresponding gridlines will not be shown in the plot anymore:

    import plotly as py
    import plotly.graph_objs as go
    import openpyxl
    import pandas as pd
    
    wb = openpyxl.load_workbook('grape output.xlsx')
    
    sheet = wb['Sheet1']
    row_max = sheet.max_row
    col_max = sheet.max_column
    first_row_list = []
    first_col_list = []
    for col_n in range(2, col_max+1):
        first_row_list.append(sheet.cell(row=1, column=col_n).value)
    for row_n in range(2,row_max+1):
        first_col_list.append(sheet.cell(row=row_n, column=1).value)
    
    data_all = pd.read_excel('grape output.xlsx')
    data_selected = data_all.loc[:,first_row_list]
    
    df = pd.DataFrame(data_selected)
    df.index = first_col_list
    colors = ['rgb(150,204,90)','rgb(255, 130, 71)','rgb(255, 193, 37)','rgb(180,240,190)','rgb(255, 10, 1)',
              'rgb(25, 19, 3)','rgb(100, 100, 100)','rgb(45,24,200)','rgb(33, 58, 108)','rgb(35, 208, 232)']
    
    data = [go.Scatter(
        x=df.columns,
        y=[country]*len(df.columns),
        mode='markers+text',
        marker=dict(
            color=colors[num],
            size= df.loc[country],
            showscale = False,
            ),
        text=list(map(str, df.loc[country])),
        textposition='middle center',
        )
        for num, country in enumerate(reversed(df.index))
    ]
    
    layout = go.Layout(plot_bgcolor='rgb(10, 10, 10)',
                       paper_bgcolor='rgb(20, 55, 100)',
                       font={
                           'size': 15,
                           'family': 'sans-serif',
                           'color': 'rgb(255, 255, 255)'
                       },
                       width=1000,
                       height=800,
                       xaxis=dict(
                           title='Output of grapes per year in different countries',
                           nticks = col_max+1,
                           type='category'
                       ),
                       showlegend=False,
                       margin=dict(l=100, r=100, t=100, b=100),
                       hovermode = False,
                       )
    
    fig = go.Figure(data=data, layout=layout)
    py.offline.plot(fig, filename='basic-scatter.html')