带有情节的主要和次要刻度线

sam*_*m81 6 r plotly

我想生成一个图形,plotly如下图所示,使用基本 R 图形生成:

带有小刻度的 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)
}
Run Code Online (Sandbox Code Playgroud)

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"))
Run Code Online (Sandbox Code Playgroud)

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

dww*_*dww 6

当您已经开始实施时,您可以通过指定放置它们的值(带有tickvals)和标签(带有ticktext)来自定义刻度。但是您需要为 中的每个刻度位置放置一个值tickvals,并且每个位置都tickval需要一个对应的ticktext. 所以,顺便主要和次要蜱区分是由ticktext设置为空字符串的所有未成年人的蜱(因为plotly doen't有一种方法来指定次刻度本身)。

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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


sam*_*m81 5

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

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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述