R Plotly多线图x轴标签

R Plotly multi line plot x axis label

我有一个非常具体的问题,与 R 中的多线绘图有关。我发现了很多与条形图有关的问题,但没有一个与我目前的情况相近。 我有以下简化的数据框和代码:

df <- data.frame(SEC_LABEL = c("3M","5Y",'10Y'), SEC1_VALUES = c(1.1, 1.4, 1.6), SEC2_VALUES = c(2.3, 2.6, 3.1), SORT=c(1,2,3))
color_line1 <- "#66C2A5"  #('rgb(102, 194, 165)')
  color_line2 <- "#8DA0CB" #('rgb(110, 194, 165)')

unique_line_names_1 <- "line1"
unique_line_names_2 <- "line2"

x_label < - as.character(df$SEC_LABEL)

p <- plot_ly(data = df, x = ~SORT) %>%
      # Time series chart
      add_lines(y = ~SEC1_VALUES, line = list(color = color_line1, width = 3),
                hoverinfo = unique_line_names_1, text = unique_line_names_1, name = unique_line_names_1)  %>%

      add_lines(y = ~SEC2_VALUES, line = list(color = color_line2, width = 3),
                hoverinfo = unique_line_names_2, text = unique_line_names_2, name = unique_line_names_2) %>%

      layout(title=paste0("Curves"),
             showlegend = TRUE,
             margin = list(l=30, r = 20, b = 30, t = 30, pad =1),
             legend = list(x = 0, y = 0.1, 
                           font = list(size = 8),
                           #orientation = 'h',
                           bgcolor ='transparent' ),
             xaxis=list(title='',
                        showline = FALSE,
                        zeroline = FALSE,
                        showticklabels = T,
                        showgrid = FALSE,
                        ticktext = x_label, 
                        gridwidth =0
                        #gridcolor = toRGB("gray50")
                        ),
             yaxis=list(title='',
                        showline = F,
                        zeroline = FALSE,
                        showgrid = T,
                        gridwidth =2)
             )

由于某些原因,x 轴上的刻度未使用向量 'x_label' 中的值重新标记。 (顺便说一句,我使用 SORT 列而不是 SEC_LABEL 列作为 x 轴的唯一原因是,否则 x 轴将按字母顺序排序。理想情况下,所需的顺序应该是:3M、5Y、 10Y,但花了两个小时后,我意识到我无法修复它)。 感谢帮助

A 我在评论中已经提到,简单的解决方案是使用有序因子,即

df$SEC_LABEL <- factor(df$SEC_LABEL, levels = x_label)

并在 x 上映射 SEC_LABEL。这样你就可以得到一个分类轴,其中的类别按所需顺序排列。

但是,我使用 schema() 查看了 plotly 文档。根据 plotly ticktext

的规范

Sets the text displayed at the ticks position via tickvals. Only has an effect if tickmode is set to array. Used with tickvals.

因此,为了使您的工作方法生效,您必须在 layout 中将 tickmode 设置为 "array",并设置 tickvals,即 c(1, 2, 3) 在你的情况下。经过这些调整后,您的方法也将起作用。