查看原文
其他

学下图层,收下这颗小星星

biocoder BT开发者 2022-09-20

前言

最近国外的疫情有点生猛,大家做好防护保重啊。周末了也不敢多走动,还是继续宅家学点东西写点笔记。

我是因为要用ggplot2画图所以才学R的。我相信做数据分析的人多多少少听过ggplot2。它是一个非常流行的做数据可视化的R包。熟悉它的绘图语法后,平时的数据可视化会变得很简单,而且也会反过来让你去思考数据的准备与清洗等等。在我还是小菜鸟的时候,当然现在了解越多越知道自己不知道的还有很多,所以现在仍然是一枚小菜鸟。

我就在想为什么ggplot2中的star不是⭐️,如果我想用自己定义的形状来画点可以不?在我老板Y叔的指点下,抽空尝试自己先写了个简单的图层。就是画小星星的图层。

安装

我已经打包放在github上了,感兴趣的自取。顺便说下,如果这篇分享的阅读量超200。那我就再分享下关于R包开发打包的微文。

if (!requireNamespace("remotes", quietly=TRUE))
install.packages("remotes")
remotes::install_github("xiangpin/ggstar")

使用

国旗

先画一面国旗,df是⭐️的坐标位置,以及大小的标签。geom_star就是实现的简单图层。

library(ggplot2)
library(ggstar)
df <- data.frame(x=c(0.13, 0.2, 0.25, 0.25, 0.2),
y=c(0.89, 0.96, 0.915, 0.855, 0.80),
size=c("B",rep("S",4)))

p <- ggplot(data=df, mapping=aes(x=x, y=y, size=size)) +
geom_star(fill="yellow",
angle=c(180, 30, 20, 180, 330),
show.legend=FALSE) +
scale_size_manual(values=c(10, 3)) +
theme_bw() +
theme(axis.text=element_blank(),
axis.ticks=element_blank(),
axis.title=element_blank(),
panel.grid=element_blank(),
panel.border=element_blank(),
panel.background=element_rect(fill="red"))

代替点图

library(ggplot2)
library(ggstar)
p2 <- ggplot(data=iris, aes(x=Sepal.Length, y=Sepal.Width, fill=Species)) +
geom_star(size=3.5) +
scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9")) +
theme_bw() +
theme(panel.grid=element_blank())
p2
set.seed(1024)
year <- rep(c(2017:2020), each=3)
para <- rep(c("length", "weight", "condition"), 4)
z_score <- runif(12, min = -5, max = 5)
daf <- data.frame(year=year, parameters=para, z_score=z_score)
daf
## year parameters z_score
## 1 2017 length -2.8191084
## 2 2017 weight 4.8763424
## 3 2017 condition -1.5153811
## 4 2018 length -1.1895301
## 5 2018 weight -4.7901404
## 6 2018 condition 2.4972687
## 7 2019 length -3.3704196
## 8 2019 weight -1.8095871
## 9 2019 condition 0.9789026
## 10 2020 length 0.8799732
## 11 2020 weight -4.8230487
## 12 2020 condition 4.5879460
legend_size <- c(10,8,5,1,5,8,10)

p3 <- ggplot(data=daf, aes(year, parameters)) +
geom_star(aes(fill = z_score, size = z_score)) +
scale_fill_continuous(type = "viridis", breaks = c(-3:3)) +
scale_size(breaks = c(-3:3), range = c(1,15)) +
guides(fill = guide_legend(),
size=guide_legend(override.aes = list(size = legend_size)))
p3

与点图搭配

p4 <- ggplot(mapping=aes(x=wt, y=mpg, fill=drat)) +
geom_point(data=subset(mtcars, cyl>6),
shape=21,
size=3,
stroke=0) +
geom_star(data=subset(mtcars, cyl<=6),
size=3.2) +
scale_fill_gradient(low="blue", high="red")+
theme_bw() +
theme(panel.grid=element_blank())
p4

总结

虽然实现了⭐️图层,但还不是最佳的方法,因为当图片拉伸后,⭐️会变形,而且也不能通过geom_pointshape来进行简单映射。翻看源码后才知道geom_point还是调用了grid,所以貌似要实现拉伸不变形以及可以和geom_point一起映射的话得再了解更深点。

期待更多技术分享,请长按下方二维码关注本公众号




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存