I was trying to make two independent plots with make_subplots and try to plot double X-axes for both subplots. In the example below, I was trying to plot two light curves in two subplots independently, where the second one is a subset of the first one. For each subplot, I want to show the x-axis with double formats, the first format in seconds to be shown in the bottom of the plot while the second format in HH:MM:SS to be shown in the top of the plot. However I can not make such a plot, and the example below shows the double axes only for the first row of subplots, and weirdly the top x-axis in HH:MM:SS is actually corresponding to the second row of subplots. Could you help me with this issue? I was using plotly version 6.0.0. Thank you so much! - Hui
import numpy as np
import pandas as pd
from datetime import datetime, timedelta
import plotly.subplots as sp
# Sample data: time in seconds and corresponding flux values
time_seconds = np.linspace(0, 10000, 100) # Time in seconds
flux = np.random.normal(1, 0.1, size=len(time_seconds)) # Random flux values
# Reference time (e.g., start of observation)
reference_time = datetime(2023, 10, 1, 12, 0, 0)
# Convert time_seconds to datetime objects
time_datetime = [reference_time + timedelta(seconds=t) for t in time_seconds]
# Create a DataFrame for easier manipulation
df = pd.DataFrame({'time_seconds': time_seconds, 'flux': flux, 'time_datetime': time_datetime})
# Define zoom-in range for the second row
zoom_start = 3000 # Start of zoom-in window (seconds)
zoom_end = 5000 # End of zoom-in window (seconds)
# Filter data for zoom-in plot
df_zoom = df[(df['time_seconds'] >= zoom_start) & (df['time_seconds'] <= zoom_end)]
# Create subplots with 2 rows (independent x-axes)
fig = sp.make_subplots(rows=2, cols=1, shared_xaxes=False, vertical_spacing=0.15)
# Add the full light curve in the first row
fig.add_trace(go.Scatter(
x=df['time_seconds'], y=df['flux'],
mode='lines', name='Full Lightcurve'
), row=1, col=1)
# Add the zoomed-in light curve in the second row
fig.add_trace(go.Scatter(
x=df_zoom['time_seconds'], y=df_zoom['flux'],
mode='lines', name='Zoomed Lightcurve'
), row=2, col=1)
# Update layout for fully independent x-axes
fig.update_layout(
height=700, width=900,
title="Lightcurve with Independent Dual X-Axes",
showlegend=True,
# First row: Bottom x-axis (seconds)
xaxis1=dict(
title='Time after reference (seconds)',
side='bottom',
anchor='y1' # Anchoring to the first row's y-axis
),
# First row: Top x-axis (HH:MM:SS)
xaxis2=dict(
title='Time (HH:MM:SS)',
side='top',
tickvals=df['time_seconds'],
ticktext=[t.strftime('%H:%M:%S') for t in df['time_datetime']],
showgrid=False,
anchor='y1' # Anchoring to the first row's y-axis
),
# Second row: Bottom x-axis (seconds)
xaxis3=dict(
title='Time after reference (seconds)',
side='bottom',
anchor='y2' # Anchoring to the second row's y-axis
),
# Second row: Top x-axis (HH:MM:SS)
xaxis4=dict(
title='Time (HH:MM:SS)',
side='top',
tickvals=df_zoom['time_seconds'],
ticktext=[t.strftime('%H:%M:%S') for t in df_zoom['time_datetime']],
showgrid=False,
anchor='y2' # Anchoring to the second row's y-axis
),
# First row: Y-axis
yaxis1=dict(
title="Flux",
showgrid=True
),
# Second row: Y-axis
yaxis2=dict(
title="Flux (Zoom-in)",
showgrid=True
)
)
# Show the plot
fig.show()
type or paste code here