简体   繁体   中英

Deal with overlapping in multiple x-axes in plotly python

I am trying to create a plot using plotly with multiple axes. And for this, I am using the following code:

#Plotly libraries and options for graphic logic
from plotly.io import to_html
import plotly.io as pio
pio.renderers.default='browser'
import plotly.graph_objects as go

#Generic libraries 
import pandas as pd
import numpy as np
from datetime import datetime

input_df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')
threshold =2.8
name_yaxis="Gap"
input_df["AAPL.High"] = (input_df["AAPL.High"]-min(input_df["AAPL.High"]))*(threshold)/(max(input_df["AAPL.High"])-min(input_df["AAPL.High"]))+np.random.uniform(0.3,0.4,1)
ID_TAIL = "ID_1"

fig = go.Figure()



fig.add_trace(go.Scatter(x=input_df['Date'], y=input_df['AAPL.High'],
                    mode='lines+markers',
                    marker_size=12,
                    line = dict(color="#C4C4C4"),
                    marker=dict(color=( (0 < input_df['AAPL.High']) & (input_df['AAPL.High'] < threshold)).astype('int'),
                                colorscale=[[0, '#A51890'], [1, '#3BBFFE']]
                                ),
                    showlegend=False,
                    xaxis="x1",
                    name = ""
                        )
                )

my_x = [ID_TAIL + "_" +format(i, '04d') + "_0" for i in range(1,input_df.shape[0])]
fig.add_trace(go.Scatter(x=my_x, y=input_df['AAPL.High'],
                    mode='lines+markers',
                    marker_size=12,
                    line = dict(color="#C4C4C4"),
                    marker=dict(color=( (0 < input_df['AAPL.High']) & (input_df['AAPL.High'] < threshold)).astype('int'),
                                colorscale=[[0, '#A51890'], [1, '#3BBFFE']]
                                ),
                    showlegend=False,
                    xaxis="x2",
                    name = ""
                        )
                )




#== Add title boxes ==#

# Add title legend for box status
fig.add_annotation( text="<b>Health status<b>", xref="paper", yref="paper",
                   x=1.02, xanchor="left",
                   y=0.9, yanchor="bottom",    # Same y as legend below
                   showarrow=False,
                   font = dict(family = "Roboto", size = 10))


  

#== End ==#

My problem is that as you can see in the following image, the ticks are overlapping:

在此处输入图片说明

So, my question is, how to create space between them?

Thanks in advance.

You can reduce the number of ticks by adding the following line

fig.update_layout(xaxis={'nticks': 8, 'tickangle': 90}, xaxis2={'nticks': 8, 'tickangle': 90})

Depending on the size of the plot, ticks may still overlap. In that case, you can either further reduce the tick number or hardcode the tick positions:

tickvalsX = ['2015-07', '2016-01', '2016-07', '2017-01']
tickvalsY = ['ID_1_0001_0', 'ID_1_00100_0', 'ID_1_0200_0', 'ID_1_0300_0', 'ID_1_0400_0', 'ID_1_0500_0']
fig.update_layout(xaxis={'tickmode': 'array', 'tickangle': 90, 'tickvals': tickvalsX}, xaxis2={'tickmode': 'array', 'tickangle': 90, 'tickvals': tickvalsY})

Further style elements of the axis you can find in the Plotly reference .

Here's a quick fix. Pop this line at the bottom of your code, and it will move xaxis2 to the top of the graph:

fig.update_layout({'xaxis2': {'side': 'top', 'tickangle': 45, 'nticks': 50}})

Output:
Shifting the secondary xaxis to the top will look like this.

在此处输入图片说明

Another Option:
Another approach would be to concatenate the axis titles into a single string, and display the concatenated string on the x-axis. This SO answer demonstrates this logic.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM