我正在尝试创建一个条形图,除非在这些条形图中,条形图被相互叠加在一起的圆圈所取代。我有以下的公司价值数据集:
> dput(my.data)
structure(list(name = c("JUU", "Lyf", "Inf", "Coi", "Tan", "Rob",
"Out", "Zen", "Com", "Pel", "Con", "Soc", "Ind", "Cro", "GRA",
"Osc", "Zoo", "Kat", "Pro", "Nia", "Uni", "23a", "Ope", "Upt",
"Qua", "Aff", "App", "Ava", "Gus", "Zoc", "Apt", "Spr", "red",
"War", "Car", "Buz", "Quo", "Squ", "Afi", "Jet", "C3 ", "Hea",
"Hum", "Nex", "STX", "Roc", "Avi", "Off", "Gin", "App", "Doc",
"Rub", "Thu", "Zet", "Med", "Rub", "Clo", "Mar", "Kab", "Dra",
"Vox", "Des", "Ada", "Age", "Ken", "SMS", "Sup", "Sym", "Zoo",
"Par"), value = c(38, 15, 10, 8.05, 6.7, 5.6, 5.51, 4.5, 4.4,
4.15, 4, 4, 3.45, 3.35, 3.2, 3.2, 3.2, 3, 3, 2.7, 2.6, 2.5, 2.47,
2.3, 2.27, 2, 2, 2, 2, 2, 1.86, 1.81, 1.8, 1.75, 1.74, 1.7, 1.7,
1.7, 1.6, 1.6, 1.51, 1.5, 1.5, 1.5, 1.5, 1.41, 1.4, 1.39, 1.38,
1.35, 1.32, 1.3, 1.3, 1.3, 1.25, 1.23, 1.2, 1.2, 1.18, 1.07,
1.07, 1.02, 1, 1, 1, 1, 1, 1, 1, 0.08), year = c(2017, 2015,
2016, 2017, 2015, 2017, 2017, 2015, 2016, 2017, 2015, 2015, 2017,
2017, 2017, 2015, 2016, 2017, 2016, 2017, 2016, 2015, 2016, 2015,
2016, 2017, 2017, 2015, 2015, 2015, 2015, 2015, 2017, 2015, 2017,
2015, 2017, 2017, 2017, 2016, 2017, 2017, 2016, 2015, 2016, 2017,
2017, 2016, 2017, 2015, 2015, 2017, 2015, 2015, 2015, 2017, 2017,
2015, 2015, 2015, 2015, 2017, 2015, 2016, 2016, 2016, 2017, 2017,
2017, 2017)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-70L))
> head(my.data, 10)
# A tibble: 10 x 3
name value year
<chr> <dbl> <dbl>
1 JUU 38 2017
2 Lyf 15 2015
3 Inf 10 2016
4 Coi 8.05 2017
5 Tan 6.7 2015
6 Rob 5.6 2017
7 Out 5.51 2017
8 Zen 4.5 2015
9 Com 4.4 2016
10 Pel 4.15 2017
这张图表应该有3个条形图,2015年、2016年和2017年每年都有一个。每个棒子由不同大小的圆圈组成,底部是最大的圆圈,顶部是最小的圆。使用value
列,计算这些圆圈的y值cumValues
:
my.data <- my.data %>%
dplyr::arrange(desc(value)) %>%
dplyr::group_by(year) %>%
# dplyr::mutate(cumValues = cumsum(valueEoy2018 ^ 0.5)) %>%
dplyr::mutate(cumValues = cumsum(value)) %>%
dplyr::ungroup()
> head(my.data %>% dplyr::filter(year == 2017))
# A tibble: 6 x 4
name value year cumValues
<chr> <dbl> <dbl> <dbl>
1 JUU 38 2017 38
2 Coi 8.05 2017 46.0
3 Rob 5.6 2017 51.6
4 Out 5.51 2017 57.2
5 Pel 4.15 2017 61.3
6 Ind 3.45 2017 64.8
..。最后,我创建了散点图:
minValue = min(my.data$value)
maxValue = max(my.data$value)
valueRange = c(minValue, maxValue)
my.data %>%
ggplot() +
geom_point(aes(x = year, y = cumValues, size = value),
alpha = 0.95, pch = 21, fill = colorGold, color = 'black') +
geom_text(aes(x = year, y = cumValues, label = ifelse(value > 5, name, '')),
size = 3, fontface = 'bold', hjust = 0.4, vjust = 1.) +
scale_size_continuous(range = valueRange)
...and收到以下消息:
这是关闭我想要的,但是我正在为2种问候而挣扎。First,最重要的是--圆圈重叠太多了。我要一个圆圈的底部去触摸它下面的圆顶。或者只是有点重叠。但没有目前的图表那么多。
在计算cumValues时,我尝试过使用不同的函数,我也尝试过使用ggplots scale_size_continuous函数,但都没有效果。我也尝试过使用scale_radius,但也没有成功。
任何帮助这将是非常感谢,因为我认为这是一个酷类型的图形,我正在努力构建。
发布于 2019-01-25 21:03:01
这里有一种使用ggforce::geom_circle
来精确控制圆圈放置的方法。我遇到的挑战是,原始数据的数值高度为100+,但数值宽度仅为2(2015年至2017年),但ggforce::geom_circle
创建了一个与坐标成比例的圆圈。所以,如果我们把x和y保持不变,你就会得到一个非常高很窄的图表,否则你就会得到非常拥挤的圆圈。我的方法是从一开始就缩放值。(我使用它们的平方根,以便将值缩放到区域,而不是半径。)
我不确定最后的图表中是否会使用y值。如果您可以删除它们,那么这就足够了,但是如果您需要它们,那么您可以手动更改y断点上的标签,或者使用标签器让它们以原来的比例尺显示。
my.data <- my.data %>%
dplyr::arrange(desc(value)) %>%
dplyr::group_by(year) %>%
dplyr::mutate(value_sqrt = sqrt(value/100),
cum_value_sqrt = cumsum(value_sqrt),
height = cum_value_sqrt - value_sqrt/2) %>%
dplyr::ungroup()
my.data %>%
ggplot() +
ggforce::geom_circle(aes(x0 = year,
y0 = height,
r = value_sqrt/2),
alpha = 0.95, fill = "gold", color = 'black') +
geom_text(aes(x = year, y = height, label = ifelse(value > 5, name, '')),
size = 3, fontface = 'bold', hjust = 0.4, vjust = 1) +
scale_x_continuous(breaks = 2015:2017, minor_breaks = F) +
coord_equal(ratio = 1)
https://stackoverflow.com/questions/54375220
复制