【问题标题】:Setting a different font color for specific x axis ticks为特定的 x 轴刻度设置不同的字体颜色
【发布时间】:2019-08-19 02:48:14
【问题描述】:

我正在创建一个频率图,其中还绘制了 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的输出

【问题讨论】:

  • 我相当有信心 plotly 不会直接提供这种能力。我能想到的唯一方法是超级复杂:在你的情节上放两个轴。除了红色刻度的刻度标签应设置为空字符串外,可以完全正常。其他轴只有一个红色刻度标签,所有其他标签都设置为空字符串。然后定位它们,使它们彼此重叠。这可能会让你开始:plot.ly/python/multiple-axes
  • @alkasm 感谢您的建议 - 它确实看起来相当令人费解,特别是因为在 matplotlib 中有一种相对简单的方法可以做到这一点。我能想到的另一种方法是在同一个图中添加 2 条迹线 - 一条为轴的黑色字体颜色,另一条为红色字体颜色。我不确定它是否会起作用,但如果我在这里没有得到答案,我会尝试一下。
  • 是的,您也可以对条形图中的条形进行不同的着色,这将有助于传达信息。

标签: python matplotlib plotly


【解决方案1】:

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

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

这确实很糟糕,但确实有效:

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()

几点说明:

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

一方面,这种方法的好处是它在某种程度上独立于您使用的绘图类型。另一方面,最好不要通过坐标轴标签,而是通过信息的风格来传达信息的差异。例如,不同颜色的条形或类似颜色可能更能说明差异。

【讨论】:

  • 嘿,谢谢,这绝对有效!但是如果我们在同一个图中添加了 2 条迹线 - 有没有办法分别更改它们中的每一个的 xaxis 刻度颜色?我试图这样做,但我只能使用 update_xaxes 一起更改两条轨迹的颜色,然后设置 tickfont = dict(color = 'red')。
  • @v_a 我相当有信心您可以使用xaxis='x3' 将附加跟踪(我的data 列表中的内容)分配给新轴,然后设置类似于我所做的轴属性这里。基本上,您可以为每个轨迹分配一个新轴。命名有点奇怪,因为您没有明确链接它,而是从情节上推断它。 IE。对于每个轴,比如layout 中的xaxis3,您可以通过跟踪kwags 中的xaxis='x3' 将跟踪链接到它,就像我在此处对第二个x 轴所做的那样。
猜你喜欢
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多