【问题标题】:Major and minor tickmarks with plotly带有情节的主要和次要刻度线
【发布时间】:2016-06-27 22:27:16
【问题描述】:

我想在plotly 中生成一个图形,如下图使用基本 R 图形生成的:

上图的R代码如下:

x = c(1,2,3,4,5)
y = c(0.1, 1, 10, 100, 1000)
axseq = y
plot(x, log10(y), yaxt="n")
axis(2, at=log10(axseq), labels=as.character(axseq))
for (i in 1:5){
    bb = 1:10; a = (bb*10^(i-2));   axis(2, at=log10(a), tcl=-0.25, labels=F)
}

到目前为止,我的plotly代码如下:

p = plot_ly(x=x, y=log10(y), mode="markers") %>%
layout(yaxis = list(tickmode="array", tickvals=log10(axseq), ticktext=as.character(axseq), zeroline=F, showline=T, ticks="outside"),
       xaxis = list(showline=T, ticks="outside"))

它有主要刻度,但我找不到如何在 y 轴上添加次要刻度。

【问题讨论】:

    标签: r plotly


    【解决方案1】:

    正如您已经开始实现的那样,您可以通过指定它们所在的值(使用tickvals)和标签(使用ticktext)来自定义刻度。但是您需要为tickvals 中的每个刻度位置设置一个值,并且每个tickval 都需要一个对应的ticktext。因此,区分主要刻度和次要刻度的方法是将所有次要刻度的刻度文本设置为空字符串(因为 plotly 没有办法指定次要刻度本身)。

    tval <- sort(as.vector(sapply(seq(1,9), function(x) x*10^seq(-1,3)))) #generates a sequence of numbers in logarithmic divisions
    ttxt <- rep("",length(tval))  # no label at most of the ticks
    ttxt[seq(1,37,9)] <- as.character(tval)[seq(1,37,9)] # every 9th tick is labelled
    
    p = plot_ly(x=x, y=y, mode="markers") %>%
      layout(yaxis = list(type="log",
                          zeroline=F, showline=T, 
                          ticks="outside",
                          tickvals=tval,
                          ticktext=ttxt),
             xaxis = list(showline=T, ticks="outside"))
    p
    

    【讨论】:

    • 谢谢,这与我正在寻找的非常接近,但是缺少一个重要的细节:次要刻度应该比主要刻度短。我应该可以使用ticklen 属性控制刻度长度,但我认为我不能分别控制主要和次要刻度的长度。
    • ticklen 只接受一个值。你不能以不同的方式设置它们
    • 我正在努力使用你的答案 dww。现在希望找到一种仅在标记的刻度处显示网格线的方法
    • @Mark 我有一个解决方案,但评论太多了。建议提出一个新问题并链接到这个问题。如果您让我知道新问题(通过此处的评论),我可以为您解答。
    • @dww 我把它贴在这里:stackoverflow.com/questions/54612142/…
    【解决方案2】:

    我通过添加一个不可见的轨迹和第二个 y 轴找到了一个解决方案,这有点 hack,但它有效:

    library(plotly)
    x = c(1,2,3,4,5)
    y = c(0.1, 1, 10, 100, 1000)
    axseq = y
    
    minTickLoc = numeric()
        for (i in 1:5){
        bb = 1:10;
        minTickLoc = c(minTickLoc, (bb*10^(i-2)))
    }
    
    
    p = plot_ly(x=x, y=y, mode="markers", marker=list(opacity=0), showlegend=F) %>%    
       add_trace(x=x, y=y, mode="markers", yaxis="y2", 
                 marker = list(color="black")) %>%
       layout(yaxis = list(type = "log", tickvals = axseq, 
                           ticktext = as.character(axseq), 
                           zeroline=F, showline=T, ticks="outside", 
                           ticklen=8, showgrid=T),
              yaxis2 = list(type="log", tickvals=minTickLoc, 
                            ticktext=rep("", length(minTickLoc)), 
                            zeroline=F, showline=F, ticks="outside", 
                            ticklen=3, showgrid=T),
              xaxis = list(showline=T, ticks="outside", ticklen=8))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 2022-11-11
      • 2020-01-15
      相关资源
      最近更新 更多