在 yaxis 上添加扭结或更改 yaxis 刻度线

Adding a kink on yaxis or changing yaxis ticks plotly

我使用以下代码生成下图:

import plotly.express as px

count = {
    '1': 1040513,
    '2': 1043584,
    '3': 46559347,
    '4': 91046152,
    '5': 207986283,
    '6': 242763604,
    '7': 253851018,
    '8': 377742455,
    '9': 532537482
}

fig = px.line(x=count.keys(), y=count.values(),
             labels={'x': 'num', 'y': 'count (in mil)'},
             title='count over nums')
fig.show()

我想更改 y 轴,使 1(在 x 轴上)的 y 轴值看起来不像 0。使用 fig.update_layout() 指定刻度大小不会由于数字和日志 y 轴不是我想要的,因此生成可辨别的图表。

已尝试使用 seaborn/matplotlib 也导致了类似的问题。任何输入!

由于 0 对大多数数据都有特殊含义,因此主要关注点似乎是您不希望接近 0 的值被误解为 0。

您可以使用自定义刻度数组并手动传递 [0, 10**6, 10**8, 2*10**8, ..., 5*10**8],但这是一个脆弱的解决方案,因为您必须提前知道 plotly 在创建图表时将生成的默认刻度值。

要使解决方案更具动态性,您可以使用完整的数字进行开发,正如 所建议的那样。您将需要 运行 在终端中执行以下操作:

pip install -U kaleido

然后我们将使用 full_fig = fig.full_figure_for_development(),它可以让您访问刻度线的范围、它们之间的间距以及第一个刻度线的位置,这些信息足以重现刻度线。之后,您可以在此数组中为您喜欢的任何值插入一个新的刻度线,例如 10**6.

如果您想包含 0 的文本标记和刻度文本,它将与 1M 的刻度文本重叠,除非您放大得足够远。我选择删除 0 的刻度线,因为很难弄清楚将 0 的刻度文本放在哪里,这样它就不会与 1M 的刻度文本重叠(但显示了两种可能性在附图中)

import numpy as np
import plotly.express as px
import plotly.graph_objects as go

count = {
    '1': 1040513,
    '2': 1043584,
    '3': 46559347,
    '4': 91046152,
    '5': 207986283,
    '6': 242763604,
    '7': 253851018,
    '8': 377742455,
    '9': 532537482
}

fig = px.line(x=count.keys(), y=count.values(),
             labels={'x': 'num', 'y': 'count (in mil)'},
             title='count over nums')

## reproduce the ytick array using the full figure for development
## reference: 
full_fig = fig.full_figure_for_development()
y_min, y_max = full_fig.layout['yaxis']['range']
y_first_tick = full_fig.layout['yaxis']['tick0']
y_dtick = full_fig.layout['yaxis']['dtick']
y_tick_array = np.arange(y_first_tick,y_max,y_dtick)

## include the tickmark for 0
# y_tick_vals = y_tick_array.tolist() + [10**6]

## remove the tickmark for 0
y_tick_vals = y_tick_array[1:].tolist() + [10**6]
y_tick_vals.sort()

fig.update_layout(
    yaxis = dict(
        tickmode = 'array',
        tickvals = y_tick_vals,
    )
)

fig.show()

如果您删除 0 的刻度线,它将如下所示:

如果包含 0 的刻度线,它将如下所示: