为特定的 x 轴刻度设置不同的字体颜色

v_a*_*v_a 3 python matplotlib plotly

我正在创建一个频率图,其中也绘制了 NA 值。我试图在 x 轴刻度中以不同的方式为 N/A 值着色。我知道如何在 matplotlib 中做到这一点,但似乎无法弄清楚如何使用 plotly 来做到这一点。

我尝试使用值列表更新 tickcolors 和 tickfonts,但它只需要这两个属性的单个值。请看下面的代码

# Doesn't work - plotly expects a single value for tickcolor
fig.update_xaxes(
    tickangle = -60, 
    tickcolor = ['black', 'black', 'black', 'black', 'red']
)

# In matplotlib the following code works fine
# It checks the text for xticklabels and changes color if it equals 'N/A'

  _  = [xl.set_color('red') for xl in plt.gca().get_xticklabels() if xl.get_text() == 'N/A / Missing']


Run Code Online (Sandbox Code Playgroud)

我希望它看起来像这样 - 这是我的 matplotlib 代码预期输出的输出

alk*_*asm 5

正如我在对 OP 的评论中提到的:

我相当有信心不直接给出这种能力。我能想到的唯一方法是超级复杂:在你的情节上放两个轴。除了红色勾号的勾号标签应设置为空字符串外,可以完全正常。其他轴只有一个红色刻度标签,所有其他标签都设置为空字符串。然后将它们放置在彼此之上。

这绝对很糟糕,但它确实有效:

import plotly.graph_objs as go

data = [go.Scatter(
    x=[1, 2, 3, 4],
    y=[4, 5, 6, 7],
    name="data"
), go.Scatter(xaxis='x2')]

layout = go.Layout(
    xaxis=dict(
        range=[0, 5],
        title="xaxis title",
        tickfont=dict(color="#1f77b4"),
        tickmode='array',
        tickvals=[1, 2, 3],
        ticktext=['a', 'b', 'c'],
    ),
    xaxis2=dict(
        range=[0, 5],
        tickfont=dict(color="#ff7f0e"),
        tickmode='array',
        tickvals=[4],
        ticktext=['d'],
        overlaying="x",
        side="bottom",
    )
)


fig = go.Figure(data=data, layout=layout)
fig.show()
Run Code Online (Sandbox Code Playgroud)

多种刻度颜色

一些注意事项:

  1. 我添加了一个空跟踪,否则我无法显示第二个轴。可能有一种方法可以在不这样做的情况下显示第二个轴,但我不知道如何。
  2. 两者的范围必须设置相同,否则第二个轴不会与第一个轴缩放,因为它们可以相互任意缩放/平移。
  3. 您必须手动指定刻度位置和值。从好的方面来说,这对于这种特定方法来说实际上有些方便。
  4. side='bottom'似乎没有必要,至少在这个情节,但它可能对他人和它的明确反正所以...我一直是在这里。

一方面,这种方法的好处在于它与您使用的绘图类型无关。另一方面,不通过轴标签,而是通过信息的样式来传达信息的差异可能会更好。例如,不同颜色的条或类似物可能更能表明差异。