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

时间:2019-08-19 02:48:14

标签: 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']


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

1 个答案:

答案 0 :(得分:2)

正如我在对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()

Multiple tick colors

一些注意事项:

  1. 我添加了一条空的迹线,否则我无法显示第二个轴。可能有一种不显示第二个轴的方法,但是我不知道怎么做。
  2. 必须在两个轴上都设置相同的范围,否则第二个轴不能与第一个轴缩放,因为它们可以彼此任意缩放/转换。
  3. 您必须手动指定刻度位置和值。从好的方面来说,这对于这种特定方法实际上有点方便。
  4. side='bottom'似乎并不是必需的,至少对于此情节而言,但这可能对其他情节来说是明确的,因此...我将其保留在此处。

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