答读者问:关于R语言ggplot2做花瓣图的几个问题

图片
image.png

有读者在公众号留言问到之前在公众号分享的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()

出图效果如下

图片
image.png
图片
image.png

我们把点图的函数换成面积图的函数就会出现如下效果

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()
图片
image.png
图片
image.png

为了给每个峰都映射一个颜色,我么还得给数据增加一个分组,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()
图片
image.png
图片
image.png

然后是第三个问题

您的这个玫瑰图的代码,在作图这里按您的模拟数据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这个数据集

图片
image.png

df1这个数据集

图片
image.png

合并以后生成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

方不方便用点常见的数据,比如土壤理化这类的出个教程呢?因为感觉您做这张图的确比普通的极坐标图好看很多

如果方便的话,可以发我一个示例数据,我用示例数据再写一个推文

欢迎大家关注我的公众号

小明的数据分析笔记本

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/156220.html

(0)
联系我们
联系我们
分享本页
返回顶部