有读者在公众号留言问到之前在公众号分享的R语言ggplot做花瓣图的代码相关问题,首先非常感谢这位读者能够这么认真的看我分享的内容,今天的推文主要回答一下这几个问题
先回答第二个问题
df1模拟生成中,1:18, 10, 180这些是怎么决定的呢?是应为df里面分组数量决定的吗?总是用180除以分组数量等分圆吗?
我这里的花瓣图是通过构造正弦函数的数据,然后画图展示正弦函数,然后再利用R语言ggplot2的极坐标实现的,
比如
y=sin(x) 在0到pi这个区间内就是一个峰
y = sin(2x)在0到pi这个区间内是2个峰,但是2个峰有正有负,所以我们取绝对值
所以就是最终出图有几个花瓣,我们就用y=sin(几x)的函数,比如最终有8个花瓣,就是用y=sin(8x)的函数
ggplot2画图是点,然后连线,这里x的取值越多,y值也会越多,最终呈现出来的线也会越平滑,这里我选择每个峰值用30个点来链接(你可以增加这个或者减少这个),如果是8个变量,x的取值范围就是1到8*30也就是1到240
8个变量构造数据的代码如下
library(ggplot2)
x<-1:(8*30)
x
y<-abs(sin(8*(x/(8*30))*pi))
ggplot(data = data.frame(x=x,y=y),
aes(x=x,y=y))+
geom_point()
ggplot(data = data.frame(x=x,y=y),
aes(x=x,y=y))+
geom_point()+
coord_polar()
出图效果如下
我们把点图的函数换成面积图的函数就会出现如下效果
ggplot(data = data.frame(x=x,y=y),
aes(x=x,y=y))+
geom_area()
ggplot(data = data.frame(x=x,y=y),
aes(x=x,y=y))+
geom_area()+
coord_polar()
为了给每个峰都映射一个颜色,我么还得给数据增加一个分组,8个变量,每个变量30个值,生成这个的代码是,这里的变量我就直接用ABCD这些字母代替了
rep(LETTERS[1:8],each=30)
ggplot(data = data.frame(x=x,y=y,group=rep(LETTERS[1:8],each=30)),
aes(x=x,y=y))+
geom_area(aes(fill=group))
ggplot(data = data.frame(x=x,y=y,group=rep(LETTERS[1:8],each=30)),
aes(x=x,y=y))+
geom_area(aes(fill=group))+
coord_polar()
然后是第三个问题
您的这个玫瑰图的代码,在作图这里按您的模拟数据df2中并不存在x的列了,怎么还能x=x呢?
这个推文里的代码 对应是10个变量,每个峰使用18个点,所以x生成的就是1:180
这个代码是
library(tidyverse)
library(ggplot2)
set.seed(123456)
df<-data.frame(x=LETTERS[1:10],
y=sample(1:20,10))
df
x<-1:180
x
y<-sin(10*x*pi/180)
df1<-data.frame(x1=x,
y1=abs(y),
var=gl(10,18,labels = LETTERS[1:10]))
head(df1)
merge(df1,df,by.x = 'var',by.y = 'x') %>%
mutate(new_y=y1*y) -> df2
ggplot(data=df2,aes(x=x,y=new_y))+
geom_area(aes(fill=var),
alpha=0.8,
color="black",
show.legend = F)+
coord_polar()+
theme_bw()+
theme(axis.text.y = element_blank(),
axis.ticks = element_blank(),
panel.border = element_blank(),
axis.title = element_blank())+
scale_x_continuous(breaks = seq(9,180,18),
labels = df$x)+
geom_text(data=df,aes(x=seq(9,180,18),
y=y+1,
label=y))
df这个数据集
df1这个数据集
合并以后生成df2这个数据集
df2这个数据集确实没有了x这个变量,但是用如下画图代码也能够画出来图
ggplot(data=df2,aes(x=x,y=new_y))+
geom_area(aes(fill=var),
alpha=0.8,
color="black",
show.legend = F)+
coord_polar()+
theme_bw()+
theme(axis.text.y = element_blank(),
axis.ticks = element_blank(),
panel.border = element_blank(),
axis.title = element_blank())+
scale_x_continuous(breaks = seq(9,180,18),
labels = df$x)+
geom_text(data=df,aes(x=seq(9,180,18),
y=y+1,
label=y))
把x换成x1也能出图
ggplot(data=df2,aes(x=x1,y=new_y))+
geom_area(aes(fill=var),
alpha=0.8,
color="black",
show.legend = F)+
coord_polar()+
theme_bw()+
theme(axis.text.y = element_blank(),
axis.ticks = element_blank(),
panel.border = element_blank(),
axis.title = element_blank())+
scale_x_continuous(breaks = seq(9,180,18),
labels = df$x)+
geom_text(data=df,aes(x=seq(9,180,18),
y=y+1,
label=y))
这个是为啥我暂时也想不明白了。如果有人知道这个原因,欢迎大家留言
(这里我突然想明白了,正常情况下是应该写x=x1的,写x=x之所以没有报错,是因为我们在构造数据的时候写了x<-1:180,这里的x实际是使用了这个x)
问题1
方不方便用点常见的数据,比如土壤理化这类的出个教程呢?因为感觉您做这张图的确比普通的极坐标图好看很多
如果方便的话,可以发我一个示例数据,我用示例数据再写一个推文
欢迎大家关注我的公众号
小明的数据分析笔记本
小明的数据分析笔记本 公众号 主要分享:1、R语言和python做数据分析和数据可视化的简单小例子;2、园艺植物相关转录组学、基因组学、群体遗传学文献阅读笔记;3、生物信息学入门学习资料及自己的学习笔记!
微信公众号好像又有改动,如果没有将这个公众号设为星标的话,会经常错过公众号的推文,个人建议将 小明的数据分析笔记本 公众号添加星标,添加方法是