This is possible by splitting the graphing in three parts and assigning each to its own x-axis. These x-axes can be placed next to each other by specifying the domain (relative coverage of space).
This is in Python, but Plotly should have the same functionality in R.
import plotly.graph_objects as go
x1 = [0.001,0.01,0.1]
x2 = [10,100,1000]
x3 = [1000,10000,100000]
y1 = [1,2,3]
y2 = [4,5,6]
y3 = [7,8,9]
fig = go.Figure()
fig.add_trace(go.Scatter(x=x1, y=y1, xaxis='x1'))
fig.add_trace(go.Scatter(x=x2, y=y2, xaxis='x2'))
fig.add_trace(go.Scatter(x=x3, y=y3, xaxis='x3'))
fig.update_layout(
xaxis1=dict(
range=[-3,0],
side='bottom',
overlaying='x',
domain=[0,0.35],
type='log'
),
xaxis2=dict(
range=[1,1000],
side='bottom',
overlaying='x',
domain=[.35,.65],
),
xaxis3=dict(
range=[3,6],
side='bottom',
overlaying='x',
domain=[.65,1],
type='log'
),
)
