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)
在你的情况下。经过这些调整后,您的方法也将起作用。
我有一个非常具体的问题,与 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 iftickmode
is set to array. Used withtickvals
.
因此,为了使您的工作方法生效,您必须在 layout
中将 tickmode
设置为 "array"
,并设置 tickvals
,即 c(1, 2, 3)
在你的情况下。经过这些调整后,您的方法也将起作用。