我正在尝试创建一个条形图,除了条形图由彼此叠置的圆圈代替。我在公司价值下面有这个数据集:
> 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
列,我计算出cumValues
这些圆的y值:
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)
...并收到以下信息:
这接近我想要的,但是我在两个方面都在挣扎。首先,也是最重要的-圆圈重叠太多。我希望一个圆圈的底部触摸其下方的圆圈的顶部。或只是一点重叠。但不如目前的图表那么多。
在计算cumValues时,我尝试使用其他函数,并且还尝试使用ggplots scale_size_continuous函数,但无济于事。我也尝试过使用scale_radius,但是也没有成功。
对此的任何帮助将不胜感激,因为我认为这是我尝试构建的一种很酷的图形。
这是一种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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句