带有R Plotly注释的林打印列

带有R Plotly注释的林打印列,r,annotations,plotly,forestplot,R,Annotations,Plotly,Forestplot,代码中的打字错误已修复,因此现在应该可以复制 我是StackOverflow的新手,所以如果我的问题或示例不够清楚,请告诉我,我会根据需要添加更多信息 我正在尝试使用plotly在R中绘制一个森林图。为此,我需要能够沿着y轴定位文本,就像它是一个格式化的表一样(列内容对于文本应该左对齐,对于数字应该右对齐,)。 我最初的解决方案是每个y轴勾选一个长的格式化字符串(使用打印格式)。这是可行的,但仅适用于单间距字体 所以现在我尝试使用注释而不是y轴标签。难点在于将每个注释/列正确放置在打印区域之外,

代码中的打字错误已修复,因此现在应该可以复制

我是StackOverflow的新手,所以如果我的问题或示例不够清楚,请告诉我,我会根据需要添加更多信息

我正在尝试使用
plotly
R
中绘制一个森林图。为此,我需要能够沿着y轴定位文本,就像它是一个格式化的表一样(列内容对于文本应该左对齐,对于数字应该右对齐,)。 我最初的解决方案是每个y轴勾选一个长的格式化字符串(使用打印格式)。这是可行的,但仅适用于单间距字体

所以现在我尝试使用注释而不是y轴标签。难点在于将每个注释/列正确放置在打印区域之外,以创建所需的格式。 我首先想找到列中最宽的字符串并相应地计算规范化坐标,但我在这方面没有经验,因此尽管我可以将注释显示为左对齐的列,但我的转换是错误的,列之间的空间很大。这是我用来计算坐标的。如果你能为我指出其他函数,或者知道如何使用这些坐标,这绝对是我的首选解决方案。请注意,要打印到绘图左/右的列数将由用户动态选择,因此绘图的边距也需要能够调整。我相信这些必须以像素为单位,所以这带来了另一种转换,从标准化坐标到像素

  longestMpg = max(strwidth(mtcars$mpg, unit = 'in'))
  coord = grconvertX(longestMpg, from = 'inches', to = 'ndc') #normalized device coordinates
  # coord = grconvertX(longestNames, from = 'inches', to = 'npc') # normalized plot coordinates
  # coord = grconvertX(longestNames, from = 'inches', to = 'nfc') # normalized figure coordinates
因此,现在我开始将每个列/注释放置在
x=0
的单独绘图中,并尝试在末尾将它们合并到一个子绘图中(这不是一个非常优雅的解决方法…)。这里的问题是,每个绘图的文本分别显示为左对齐(此时我不尝试混合左对齐和右对齐的文本),但只要我将两个绘图放入一个子绘图中,第二个绘图中的文本就会居中对齐。下面是一个非常简单的例子:

library(plotly)

# Plot only mtcar$disp
aPlot = plotly_empty(mtcars, type = "scatter", mode = "markers") %>%
  config(
    displayModeBar = FALSE
  )

for (i in 1:nrow(mtcars)) {
  aPlot = aPlot %>% add_annotations(x = 0,
                                    y = i,
                                    text = mtcars$disp[i],
                                    xref = 'paper',
                                    yref = 'y',
                                    showarrow = F) %>%
    layout(yxaxis = list(showline = T), yaxis = list(showline = T))

}

# Plot only mtcar rownames
bPlot = plotly_empty(mtcars, type = "scatter", mode = "markers") %>%
  config(
    displayModeBar = FALSE
  )
for (i in 1:nrow(mtcars)) {
  bPlot = bPlot %>% add_annotations(x = 0,
                                    y = i,
                                    text = rownames(mtcars)[i],
                                    xref = 'paper',
                                    yref = 'y',
                                    showarrow = F) %>%
    layout(yxaxis = list(showline = T), yaxis = list(showline = T))

}

# Subplot
subplot(aPlot, bPlot, shareX = T, shareY = F)
也许有一个更简单,更优雅的方式来实现我所寻找的,我很高兴学习新的东西,所以请不要犹豫,分享你的想法。
谢谢你的帮助

欢迎来到stackoverflow!不幸的是,你的问题无法重现。请与我们共享
dput(plotData)
dput(head(plotData))
的输出。关于
列内容,文本应左对齐,数字应右对齐
您的示例显示所有列均左对齐?顺便说一句,你知道吗?谢谢你回复我@ismirsehregal。我的错误-将
plotData
替换为
mtcars
,它应该可以工作(plotData是我无法在此处共享的原始数据集,因此我使用mtcars尝试并演示)。最终的目标是能够灵活地混合搭配。现在,如果我能弄清楚如何让每件事都左对齐或右对齐,我会很高兴。我不知道有多少张桌子。这看起来是一个非常好的解决方案,如果我能弄清楚如何将表行与数据精确对齐,使表看起来像是绘图的注释。