如何将值放在格条形图的条形图中并有图例

Posted

技术标签:

【中文标题】如何将值放在格条形图的条形图中并有图例【英文标题】:How can I put values in the bars of a lattice barchart and have a legend 【发布时间】:2020-04-04 01:46:42 【问题描述】:

更新

如果我从自动键行中删除“points=FALSE”,图例将显示颜色,但不会显示它有一个矩形,而是一个圆/点。

原始问题

我有一个包含图例的堆叠条形图,我想在条形图内添加数字以显示相对值。我似乎可以(图例和价值观)中的任何一个,但不能两者兼而有之。

使用下面的测试代码,我得到一个图表,显示堆叠条形图中的值。

dta <- data.frame(x=c(46.0, 14.7, 16.4, 15.8, 7.0), y=c("Back", "Neck", "Extrem", "MuscSkel", "Oth"))
barchart(data=dta, ~x, group=y,
         stack=T,col=sort(brewer.pal(7,"Purples")), xlab="Percent",
         box.width=.5, scales=list(tick.number=10),
         panel=function(x,y,...)
           panel.barchart(x,y,...)
           panel.text(cumsum(x)-dta$x/2,y,labels=dta$x)
         )

如果我运行这段代码,我会得到一个带有图例的图表。

dta <- data.frame(x=c(46.0, 14.7, 16.4, 15.8, 7.0), y=c("Back", "Neck", "Extrem", "MuscSkel", "Oth"))
barchart(data=dta, ~x, group=y,
         stack=T, xlab="Percent",
         box.width=.5, scales=list(tick.number=10),
         auto.key = list(space="right", cex=.5, border=T, points=F, lines=F, lwd=5, text=c("Back", "Neck", "Extrem", "MuscSkel", "Oth")),
         par.settings=list(superpose.polygon=list(col = rainbow(length(c("Back", "Neck", "Extrem", "MuscSkel", "Oth")))), 
               fill=rainbow(length(c("Back", "Neck", "Extrem", "MuscSkel", "Oth")))))

但是当我组合代码时,它看起来像这样,结果图没有显示图例中的颜色:

dta <- data.frame(x=c(46.0, 14.7, 16.4, 15.8, 7.0), y=c("Back", "Neck", "Extrem", "MuscSkel", "Oth"))
barchart(data=dta, ~x, group=y,
         stack=T, xlab="Percent",
         box.width=.5, scales=list(tick.number=10),
         auto.key = list(space="right", cex=.5, border=T, points=F, lines=F, lwd=5, text=c("Back", "Neck", "Extrem", "MuscSkel", "Oth")),
         par.settings=list(superpose.polygon=list(col = rainbow(length(c("Back", "Neck", "Extrem", "MuscSkel", "Oth")))), 
                             fill=rainbow(length(c("Back", "Neck", "Extrem", "MuscSkel", "Oth")))),
         panel=function(x,y,...)
           panel.barchart(x,y,...)
           panel.text(cumsum(x)-dta$x/2,y,labels=dta$x)
         )

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

更改代码以将“rectangles=T”添加到自动键行有效。现在它同时显示了条形图中的值和带有颜色的图例代码如下所示:

dta <- data.frame(x=c(46.0, 14.7, 16.4, 15.8, 7.0), y=c("Back", "Neck", "Extrem", "MuscSkel", "Oth"))
barchart(data=dta, ~x, group=y,
         stack=T, xlab="Percent",
         box.width=.5, scales=list(tick.number=10),
         auto.key = list(space="right", cex=.5, border=T, points=F, rectangles = T, lines=F, lwd=5, text=c("Back", "Neck", "Extrem", "MuscSkel", "Oth")),
         par.settings=list(superpose.polygon=list(col = rainbow(length(c("Back", "Neck", "Extrem", "MuscSkel", "Oth")))), 
                             fill=rainbow(length(c("Back", "Neck", "Extrem", "MuscSkel", "Oth")))),
         panel=function(x,y,...)
           panel.barchart(x,y,...)
           panel.text(cumsum(x)-dta$x/2,y,labels=dta$x)
         )

【讨论】:

【参考方案2】:

只是提到这个替代方案(因为您希望自己解决您的问题;)),您可以使用ggplot2 获得相同的图表,您只需要使用dplyr 创建一个新列w

library(ggplot2)
library(dplyr)
dta %>% mutate(w = cumsum(x)) %>% 
  ggplot(., aes(xmin = w-x, xmax = w, ymin = 1, ymax = 3))+
  geom_rect( aes(fill = y))+
  geom_text(aes(label = x, x = w - x/2, y = 2))+
  ylim(0,4)+
  xlab("Percent")+
  ylab("")+
  theme(axis.text.y = element_blank(),
        axis.ticks.y = element_blank())

【讨论】:

以上是关于如何将值放在格条形图的条形图中并有图例的主要内容,如果未能解决你的问题,请参考以下文章

反转图例顺序而不更改绘图快速条形图中的条形顺序

分组条形图的子图分组图例

Plotly:如何重命名 plotly express 堆积条形图的图例元素?

修改 pandas 条形图的图例

如何在 plotly express 条形图中隐藏颜色条和图例?

如何关闭 ggplot 堆叠条形图中的颜色图例?所有解决方案都失败了