问题:,我有一个堆叠的条形图。在每个堆叠条的上方,我想要一个总数(即两条的和-这里:total)。我试着使用add_text,但结果并不像预期的那样。有什么建议要改变吗?
备注:我不想强制转换data.table对象。要在其上进行可视化的目标框架是new_frame。
非常感谢

library(data.table)
library(plotly)
Animals <- c("giraffes", "orangutans", "monkeys")
SF_Zoo <- c(20, 14, 23)
LA_Zoo <- c(12, 18, 29)
data <- data.table(Animals, SF_Zoo, LA_Zoo)
new_frame <- data.table::melt(data, id.vars='Animals')
new_frame[, total := sum(value), by = Animals]
plot_ly(new_frame, x = ~Animals,
y = ~value,
type = 'bar',
name = ~variable,
hoverinfo = "text",
text = ~paste(variable, value, total)) %>%
## Not working
add_text(x = ~Animals, y = ~value,
text = ~total, textposition = "top center") %>%
layout(yaxis = list(title = 'Count'), barmode = 'stack')发布于 2021-02-02 20:19:13
实际上是个强大的包我和你在一起..。有些逻辑并不总是不言自明的。特别是在添加悬空文本、文本元素和/或注释时。您必须注意哪些是变量,哪些是要添加/控制的文本元素。我希望下面的内容能让你一步步度过难关.
(I)使用data.table隐藏文本--您提供了一个跟踪data.frame (大致上考虑ggplot中的geom )。在本例中,是一个"bar" trace。为了使代码更清晰,我对代码做了一些修改,方法是取出数据,只使用空的plot_ly()调用并故意添加"bar"-trace。这完全没有必要。然而,它可以让你理解你在做什么。
new_frame %>%
plot_ly() %>%
add_bars(x = ~Animals,
y = ~value,
type = 'bar',
name = ~variable,
hovertemplate = "my value: %{y}"
) %>%
## Not working
# add_text(x = ~Animals, y = ~value,
# text = "gotcha", textposition = "top center") %>%
layout(yaxis = list(title = 'Count'), barmode = 'stack')使用此代码,您已经更改了“悬停”工具提示的表示形式。name参数控制工具提示的“标题”。例如,在地块上悬停显示格式化的悬停,即"my value:“和堆叠栏的名称"SF_Zoo”。在模板定义中,您引用的是y变量,而不是dataframe (列)变量(name)。

(II)添加了一个“文本”,再一次用添加"text" trace来思考geom_text。请注意,跟踪在这里并不完全正确。然后将文本的位置映射到add_text()调用的x和y参数。这将在每个映射的位置(x,y)显示一个文本片段。在这个例子中,我提供了一个长度与(x,y)组合相同长度的文本向量。如果提供单个字符串,则将复制该字符串。在这里,text trace继承自您的new_frame。注意,您可以在这里提供一个新对象,类似于下一步中定义的对象。
(III)添加注释和add_annotations(),您可以添加文本元素和指针。同样,您可以提供一个新对象。由于我们只需要这3只动物的总数,我将这一步的data降低到所需的水平。使用这种“数据格式”,我现在可以将变量total提供给text参数。我将showarrow = TRUE设置为提供一个示例,说明如何使用箭头来增强文本添加。
new_frame %>%
plot_ly() %>%
add_bars(x = ~Animals,
y = ~value,
type = 'bar',
name = ~variable,
hovertemplate = "my value: %{y}"
) %>%
## Now let's add a text trace (think ggplot layer)
add_text( x = ~Animals
,y = ~value,
,text = c("one","two","three","four","five","six") # this overwrites your values with a string
,textposition = "center"
) %>%
## add annotation
add_annotations(data = new_frame %>% select(Animals, total) %>% unique()
,x = ~Animals
,y = ~total
,text = ~total
## remove arrow and offset
,showarrow = TRUE
## with showarrow = TRUE you can control the arrow
# , ax = 20
# , ay = 40
) %>%
## control the layout of the chart
layout(yaxis = list(title = 'Count'), barmode = 'stack')

可以自由地探索更多的选择。
总之,您可以巧妙地向x, y, or text提供一个值向量。严格地说,这些文件不需要组织成数据格式。dataframe允许您使用变量的~符号。有两种添加文本的方法。确保理解如何将位置映射(x,y)与文本结合使用。对于纯粹主义者来说,add_annotation()更符合ggplot的任意文本。但是,通过定义提供给add_text()的数据对象,您可以获得类似的结果。add_annotations()为您提供了一些带有各种箭头设计的附加样式元素。
https://stackoverflow.com/questions/61948955
复制相似问题