首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有条形文字总量的-Stacked条形图

有条形文字总量的-Stacked条形图
EN

Stack Overflow用户
提问于 2020-05-22 06:20:15
回答 1查看 1.4K关注 0票数 1

问题:,我有一个堆叠的条形图。在每个堆叠条的上方,我想要一个总数(即两条的和-这里:total)。我试着使用add_text,但结果并不像预期的那样。有什么建议要改变吗?

备注:我不想强制转换data.table对象。要在其上进行可视化的目标框架是new_frame

非常感谢

代码语言:javascript
复制
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')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-02 20:19:13

实际上是个强大的包我和你在一起..。有些逻辑并不总是不言自明的。特别是在添加悬空文本、文本元素和/或注释时。您必须注意哪些是变量,哪些是要添加/控制的文本元素。我希望下面的内容能让你一步步度过难关.

(I)使用data.table隐藏文本--您提供了一个跟踪data.frame (大致上考虑ggplot中的geom )。在本例中,是一个"bar" trace。为了使代码更清晰,我对代码做了一些修改,方法是取出数据,只使用空的plot_ly()调用并故意添加"bar"-trace。这完全没有必要。然而,它可以让你理解你在做什么。

代码语言:javascript
复制
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设置为提供一个示例,说明如何使用箭头来增强文本添加。

代码语言:javascript
复制
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()为您提供了一些带有各种箭头设计的附加样式元素。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61948955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档