有没有一种方法可以使用barplot或ggplot在同一张图上同时具有barplot和stacked barplot?

希拉里

我有两个要叠加到同一图上的数据。我看过几本ggplot文章,但我认为ggplot中不可能。所以我一直在使用barplot。我有5层,我正在按层绘制总金额,以实线表示。

然后,我还有另一个数据,代表两种不同类型的工作人员在这些层中的任务数。我将其作为堆积的条形图。但是我想将它们的总金额显示在同一张图上,并将其显示为一个条,然后在其旁边显示相应的堆叠条。

这是情节: 按工作人员类型排列的总任务条形图

每层总美元条形图

第一张图的数据如下所示(它是一个表):

        1     2     3     4     5
  0     9   340    97   812  4271
  1     1   417   156  3163 11314

第二张图的数据如下所示(这是一个数据集):

    Tier    variable    value
1   1   Opp_Amt 16200.00
2   2   Opp_Amt 116067.50
3   3   Opp_Amt 35284.12
4   4   Opp_Amt 278107.10
5   5   Opp_Amt 694820.29

我想将图放在彼此的顶部,但条形图保持重叠,并且希望它们并排显示。

到目前为止的代码。

par(mar=c(2.5, 4, 4, 4)+2)
## Plot first set of data and draw its axis
barplot(data1$value, axes=FALSE,ylim=c(0,700000), xlab="", ylab="", 
        col="black",space=-10,main="Work Score")
axis(2, ylim=c(0,700000),col="black",las=1)  ## las=1 makes horizontal labels
mtext("Total Opportunity Amount",side=2,line=3.5)
box()

## Allow a second plot on the same graph
par(new=TRUE)

## Plot the second plot and put axis scale on right


m <- barplot(counts,  xlab="", ylab="", ylim=c(0,16000),axes=FALSE, col=c("red","darkblue"),space=3,width=0.5,density=20)
## a little farther out (line=4) to make room for labels
mtext("Task Ratio: Outbound to AE",side=4,col="red",line=3.5) 
axis(4, ylim=c(0,16000), col="red",col.axis="black",las=1)

这给了我 叠加图

桑迪·穆斯普拉特(Sandy Muspratt)

使用ggplot,我将执行以下操作之一。他们分别绘制了两组数据。首先将数据排列到一个数据框中,然后用于facet_wrap()并排放置图。第二个步骤分别生成两个图对象,然后将两个图和图例组合成一个组合图。

但是,如果您确实需要“双y轴”方法,则需要进行一些摆弄,并使用绘图的布局和gtable功能,就可以做到这一点(使用从这里借来的代码)。

像这样:

library(ggplot2)
library(gtable)
library(plyr)

df1 <- data.frame(Tier = rep(1:5, each = 2),
       y = c(9, 1, 340, 417, 97, 156, 812, 3063, 4271, 11314),
       gp = rep(0:1, 5))

df2 <- read.table(text = "
    Tier    variable    value
   1   Opp_Amt 16200.00
   2   Opp_Amt 116067.50
   3   Opp_Amt 35284.12
   4   Opp_Amt 278107.10
   5   Opp_Amt 694820.29", header = TRUE)


dfA = df1
dfB = df2
names(dfA) = c("Tier", "Value", "gp")
dfA$var = "Task Ratio"
dfB = dfB[,c(1,3)]
dfB$gp = 3
dfB$var = "Total Opportunity Amount"
names(dfB) = names(dfA)
df = rbind(dfA, dfB)
df$var = factor(df$var)
df$var = factor(df$var, levels = rev(levels(df$var)))

 ggplot(df, aes(Tier, Value, fill = factor(gp))) +
    geom_bar(position = "stack", stat = "identity") +
    facet_wrap( ~ var, scale = "free_y") +
    scale_fill_manual("Group", breaks = c("0","1"), values = c("#F8766D", "#00BFC4", "black")) +
    theme_bw() +
    theme(panel.spacing = unit(2, "lines"),
          panel.grid = element_blank()) 



或这个:

p1 <- ggplot(df1, aes(factor(Tier), y, fill = factor(gp))) +
   geom_bar(position = "stack", stat = "identity") +
   #guides(fill = FALSE) +
   scale_y_continuous("Task Ratio",
     limit = c(0, 1.1*max(ddply(df1, .(Tier), summarise, sum = sum(y)))), 
     expand = c(0,0)) +
   scale_x_discrete("Tier") +
   theme_bw() +
   theme(panel.grid = element_blank())

p2 <- ggplot(df2, aes(factor(Tier), value)) +
   geom_bar(stat = "identity") +
   scale_y_continuous("Total Opportunity Amount", limit = c(0, 1.1*max(df2$value)),  expand = c(0,0)) +
   scale_x_discrete("Tier") +
   theme_bw() +
   theme(panel.grid = element_blank())    

# Get the ggplot grobs,
# And get the legend from p1
g1 <- ggplotGrob(p1)
leg = gtable_filter(g1, "guide-box")
legColumn = g1$layout[which(g1$layout$name == "guide-box"), "l"]
g1 = g1[,-legColumn]
g2 <- ggplotGrob(p2)

# Make sure the width are the same in g1 and g2
library(grid)
maxWidth = unit.pmax(g1$widths, g2$widths)

g1$widths = as.list(maxWidth)
g2$widths = as.list(maxWidth)

# Combine g1, g2 and the legend
library(gridExtra)
grid.arrange(arrangeGrob(g2, g1, nrow = 1), leg,
   widths = unit.c(unit(1, "npc") - leg$width, leg$width), nrow=1)



或双Y轴方法(但由于@Phil的帖子中给出的原因而不建议使用):

width1 = 0.6       # width of bars in p1
width2 = 0.2       # width of bars in p2
pos = .5*width1 + .5*width2    # positioning bars in p2

p1 <- ggplot(df1, aes(factor(Tier), y, fill = factor(gp))) +
   geom_bar(position = "stack", stat = "identity", width = width1) +
   guides(fill = FALSE) + 
   scale_y_continuous("", 
     limit = c(0, 1.1*max(ddply(df1, .(Tier), summarise, sum = sum(y)))), 
     expand = c(0,0)) +
   scale_x_discrete("Tier") +
   theme_bw() +
   theme(panel.grid = element_blank(),
         axis.text.y = element_text(colour = "red", hjust = 0, margin = margin(l = 2, unit = "pt")),
         axis.ticks.y = element_line(colour = "red"))

p2 <- ggplot(df2, aes(factor(Tier), value)) +
   geom_blank() +
   geom_bar(aes(x = Tier - pos), stat = "identity", width = width2) +
   scale_y_continuous("", limit = c(0, 1.1*max(df2$value)),  expand = c(0,0)) +
   theme_bw() +
   theme(panel.grid = element_blank())

# Get ggplot grobs
g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)

# Get locations of the panels in g1
pp1 <- c(subset(g1$layout, name == "panel", se = t:r))

## Get bars from g2 and insert them into the panel in g1
g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name == "panel")]][[4]][[4]], pp1$t, pp1$l)

# Grab axis from g1, reverse elements, and put it on the right
index <- which(g1$layout$name == "axis-l")
grob <- g1$grobs[[index]]
axis <- grob$children[[2]]
axis$widths <- rev(axis$widths)
axis$grobs <- rev(axis$grobs)
axis$grobs[[1]]$x <- axis$grobs[[1]]$x - unit(1, "npc") + unit(3, "pt")

g <- gtable_add_cols(g, g1$widths[g1$layout[index, ]$l], pp1$r)
g <- gtable_add_grob(g, axis, pp1$t, pp1$l+1)

# Grab axis from g2, and put it on the left
index <- which(g2$layout$name == "axis-l")
grob <- g2$grobs[[index]]
axis <- grob$children[[2]]
g <- gtable_add_grob(g, rectGrob(gp = gpar(col = NA, fill = "white")), pp1$t-1, pp1$l-1, pp1$b+1)
g <- gtable_add_grob(g, axis, pp1$t, pp1$l-1)

# Add axis titles
# right axis title
RightAxisText = textGrob("Task Ratio", rot = 90, gp = gpar(col = "red"))
g <- gtable_add_cols(g, unit.c(unit(1, "grobwidth", RightAxisText) + unit(1, "line")), 5)
g <- gtable_add_grob(g, RightAxisText, pp1$t, pp1$r+2)

# left axis title
LeftAxisText = textGrob("Total Opportunity Amount", rot = 90)
g <- gtable_add_grob(g, LeftAxisText, pp1$t, pp1$l-2)
g$widths[2] <- unit.c(unit(1, "grobwidth", LeftAxisText) + unit(1, "line"))

# Draw it
grid.newpage()
grid.draw(g)

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有一种方法可以使用barplot或ggplot在同一张图上同时显示一个barplot和一个堆叠的barplot?

来自分类Dev

有没有一种方法可以分隔ggplot中的barplot,使其先获取第n行,然后生成一个barplot,然后再获取第n行,直到nrow(df)完成?

来自分类Dev

使用R barplot功能分组的barplot

来自分类Dev

ggplot2 barplot

来自分类Dev

Barplot savefig()返回AttributeError

来自分类Dev

barplot()中的订购栏

来自分类Dev

Seaborn Barplot:异类条形

来自分类Dev

标记堆叠的barplot

来自分类Dev

barplot()中的订购栏

来自分类Dev

R 3.1.1中的barplot

来自分类Dev

在barplot上叠加标记

来自分类Dev

命名参数情节Barplot

来自分类Dev

barplot的多个图例填充ggplot

来自分类Dev

R 和比例中的 BARPLOT

来自分类Dev

R中带有ggplot2的堆叠Barplot

来自分类Dev

如何绘制具有连续x轴的barplot / barchart

来自分类Dev

如何绘制具有连续x轴的barplot / barchart

来自分类Dev

使用ggplot()作为计数表的堆叠Barplot

来自分类Dev

如何进行成组的barplot?

来自分类Dev

Barplot忽略调色板

来自分类Dev

R-Project Barplot颜色

来自分类Dev

barplot python中的双标签

来自分类Dev

如何使用带有 Pandas 数据集的 Seaborn 修复 Barplot 错误(它不会让我对我的变量进行 barplot)

来自分类Dev

GGplot Barplot不接受Y值吗?

来自分类Dev

如何在R的ggplot中更改barplot

来自分类Dev

ggplot barplot中的y轴顺序错误

来自分类Dev

ggplot2 barplot无法正确添加

来自分类Dev

在ggplot barplot中指定条形颜色

来自分类Dev

将图例添加到barplot ggplot