如何绘制不是从零开始的分组条形图?

时间:2019-03-25 20:16:47

标签: r ggplot2 bar-chart

我有以下数据框

unit <- c("a", "b", "c", "d")
top1990 <- c(100, 80, 70, 90)
base1990 <- c(40, 60, 20, 30)
top2000 <- c(120, 85, 65, 80)
base2000 <- c(40, 65, 25, 15)
df <- data.frame(unit, top1990, base1990, top2000, base2000)

unit top1990 base1990 top2000 base2000
a     100       40     120       40
b      80       60      85       65
c      70       20      65       25
d      90       30      80       15

我需要在同一张图上绘制,每个单位有两个条形,一个条形代表1990年,另一个条形代表2000年。每个条形都应从值“ base ***”开始,并应于值“ top ****”。我还需要按“ top1990”(递减顺序)订购单位。

我使用了ggplot2库的函数 geom_segment ,如下所示

df$unit <- factor(df$unit, levels = df$unit[order(df$top1990, decreasing = T)])    

ggplot(data = df) + geom_segment(aes(x=df$unit, xend=df$unit, y=df$top1990, yend=df$base1990), size = 7, color = "blue") +
geom_segment(aes(x=df$unit, xend=df$unit, y=df$top2000, yend=df$base2000), size = 7, color = "red")

但是,我获得了this,其中的条形重叠,因此我需要并排放置。

enter image description here

我想念什么?

1 个答案:

答案 0 :(得分:3)

我认为有必要先转换您的数据。我建议$values = '1.2.0' $after = $values.split('.'); $result = [int]$after; # TODO increment the last decimal value, result should be 1.2.3 $result 满足您的转换需求。我认为您想要的是{cdata},它的尺寸较大,看起来像盒子。

geom_linerange()

借助unit <- c("a", "b", "c", "d") top1990 <- c(100, 80, 70, 90) base1990 <- c(40, 60, 20, 30) top2000 <- c(120, 85, 65, 80) base2000 <- c(40, 65, 25, 15) df <- data.frame(unit, top1990, base1990, top2000, base2000) library(cdata) library(ggplot2) control_table <- qchar_frame( year, base , top | 1990, "base1990", "top1990" | 2000, "base2000", "top2000" ) df_2 <- rowrecs_to_blocks( df, controlTable = control_table, controlTableKeys = "year", columnsToCopy = "unit" ) df_2 %>% ggplot(aes(unit, ymin = base, ymax = top, color = year)) + geom_linerange(position = position_dodge(width = 1), size = 20) ,我将您的数据转换为这种形式

{cdata}

我们现在可以将 unit year base top 1 a 1990 40 100 2 a 2000 40 120 3 b 1990 60 80 4 b 2000 65 85 5 c 1990 20 70 6 c 2000 25 65 7 d 1990 30 90 8 d 2000 15 80 用作base,将ymin用作top作为ymax的美学。

这是输出图(我在行大小上稍加夸张,并且闪避宽度可以更小,以使行彼此更靠近。)

Base to Top with a Thick LineRange

我希望这会有所帮助。