我有以下数据框
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,其中的条形重叠,因此我需要并排放置。
我想念什么?
答案 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
的美学。
这是输出图(我在行大小上稍加夸张,并且闪避宽度可以更小,以使行彼此更靠近。)
我希望这会有所帮助。