Lollipop是条形图/柱状图的一种,总体呈现效果比条形图/柱状图更加美观和易懂,一般我们用条形图展示如下:
换成棒棒糖图如下:
棒棒糖图绘制相对简单:
library(ggplot2)
library(ggthemes)
library(splines)
library(dplyr)
value <- abs(rnorm(10)) * 2
don <- data.frame(
X = paste0("A", seq(1, 10)),
value = value
)%>%
mutate(x=factor(X, X))
don %>%
ggplot( aes(x=X, y=value) ) +
geom_segment( aes(x=X ,xend=X, y=0, yend=value), color="grey") +
geom_point(size=3, color="#69b3a2") +
# 翻转
# coord_flip() +
theme_few() +
theme(
panel.grid.minor.y = element_blank(),
panel.grid.major.y = element_blank(),
legend.position="none"
) +
xlab("") +
ylab("lollipop plot")
一个简单的棒棒糖图就绘制好了,如果是简单的图形我们用棒棒糖图,反而图形的美观度不如条形图。但是如果我们需要展示成对的比较此时用哑铃图(可以看做棒棒糖图变种)是更加直观:
上图也是近两年CNS文章的标配,下面我们一步步用R来绘制上图:
library(ggplot2)
library(ggthemes)
library(splines)
library(dplyr)
value1 <- abs(rnorm(26)) * 2
don <- data.frame(
#x=LETTERS[1:26], # 假如你有100个样本定义1~100个数即可,目的是后续做拟合线用
x = seq(1, 26),
value1 = value1,
value2 = value1 + 3 + rnorm(26, sd = 1)
) %>%
rowwise() %>%
mutate(mymean = mean(c(value1, value2))) %>%
arrange(mymean) %>%
mutate(x = as.integer(x, x))
ggplot(don) +
geom_segment(aes(
x = x,
xend = x,
y = value1,
yend = value2
),
color = "grey",
size = 1.5) +
geom_point( # 添加第一个点
aes(x = x, y = value1),
group = 1,
color = rgb(0.2, 0.7, 0.1, 0.8),
size = 3
) +
geom_smooth( # 添加拟合曲线
aes(x = x, y = value1),
linetype = 3,
group = 1,
method = "loess",
formula = y ~ splines::ns(x),
color = "LightGreen", # 设置拟合线的颜色
fill = "LightGreen" # 设置填充色(置信区域)
) +
geom_line(
aes(x = x, y = value1),
group = 1,
color = rgb(0.2, 0.7, 0.1, 0.8),
# 0 = blank, 1 = solid, 2 = dashed, 3 = dotted, 4 = dotdash, 5 = longdash, 6 = twodash
linetype = 1
) +
geom_point(aes(x = x, y = value2),# 添加第二个点
color = rgb(0.7, 0.2, 0.1, 0.8),
size = 3) +
geom_smooth(
aes(x = x, y = value2),
group = 1,
linetype = 3,
method = "loess",
formula = y ~ splines::ns(x),
color = "RosyBrown1",
fill = "RosyBrown1"
) +
geom_line(
aes(x = x, y = value2),
group = 2,
color = rgb(0.7, 0.2, 0.1, 0.8),
linetype = 1
) +
#coord_flip()+ # 如果需要翻转图形,请去掉此处注释
theme_few() +
xlab("") +
ylab("Value of Y") + # 设置Y轴标题
scale_x_discrete(limits = LETTERS[1:26]) # 最后将坐标轴换回我们原始的名称,(此处需要和开始seq的数量对应)
写在最后,所有的图形可视化的目的都是为了更加清楚的展示你的数据信息,使其更加直观!
参考资料:
1.https://www.data-to-viz.com/graph/lollipop.html