R语言绘制颜色变化的同心圆动图

  • 将R的极客理想(工具篇)一书,利用caTools包绘制圆形的代码整理解释如下:

 

当时不懂第四步的公式,提问在这里:https://ask.csdn.net/questions/7414407

对于for(i in 1:10) image[,,i] = cos(r-(2*pi)*i/10)/(r**0.25)

  • 分析如下:

如果image[,,1:10]只填入cos(r),而不涉及*i/10,则image为十张一模一样的图片;

如果cos(r-i);cos(r-i/10);cos(r-(2*pi)*i/10),则产生流动;cos(r-(2*pi)*i却不会动,可能是因为2*pi是一个周期;pi与2pi没影响;3.5*pi则会变动不流畅,缺乏周期性;没有pi显得颜色红亮;

cos(r-(2*pi)*i/10)除以r、2r,颜色深蓝;除以r平方会导致圈圈极小;除以(r**0.5)导致圈圈大,且开根号越大颜色越艳丽,条纹越来越多;

扫描二维码关注公众号,回复: 13377077 查看本文章

cos(r-(2*pi)*i/10)/(r**0.25)为最佳,考虑周期、变动、颜色不艳不暗,/(r**0.25)导致圈圈与圈间距大,条纹多。

详细统计如下,请忽略。

 

代码

图示

解释

1

library(caTools); x <- y <- seq(-4*pi, 4*pi, len=200); r <- sqrt (outer (x**2, y**2, '+'));

image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r)

write.gif (image, "cosr.gif", col="rainbow"); z = read.gif("cosr.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

共10帧相同画面,看起来像静图,颜色红艳

cos(r)只能构成十张一模一样的圈圈

2

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r-(2*pi*i/10))

write.gif (image, " cosr_sub.gif", col="rainbow"); z = read.gif(" cosr_sub.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

共10帧不同画面,且流动成动画,颜色鲜艳同上

 cos(r-(2*pi*i/10))构造十张不同的渐变圈圈

3

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r)/(r**0.25)

write.gif (image, " cosr_div.gif", col="rainbow"); z = read.gif(" cosr_div.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

共10帧相同画面,看起来像静图,颜色透亮

cos(r)/(r**0.25)只能构成十张一模一样的圈圈

4

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r)/(r)

write.gif (image, " cosr_divr.gif", col="rainbow"); z = read.gif(" cosr_divr.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

10帧相同画面,都是红色的,圈圈不明显

 cos(r)/(r)只能构成十张一模一样的圈圈

5

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r-(2*pi*i/10))/r

write.gif (image, " cosr_sub_div.gif", col="rainbow"); z = read.gif(" cosr_sub_div.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

共10帧不同画面,且流动成动画,颜色深蓝

cos(r-(2*pi*i/10))/r构造十张不同的渐变圈圈

6

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r-(2*pi)*i/10)/(2*r)

write.gif (image, " cosr_sub_div2r.gif", col="rainbow"); z = read.gif(" cosr_sub_div2r.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

同上

 cos(r-(2*pi)*i/10)/(2*r)同上,/(2*r)导致颜色深蓝

7

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r-(2*pi)*i/10)/(r**2)

write.gif (image, " cosr_sub_divr2.gif", col="rainbow"); z = read.gif(" cosr_sub_divr2.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

共10帧不同画面,且流动成动画,颜色亮蓝,且圈圈极小

/(r**2)导致圈圈小

8

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r-(2*pi)*i/10)/(r**0.5)

write.gif (image, " cosr_sub_divr05.gif", col="rainbow"); z = read.gif(" cosr_sub_divr05.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

共10帧不同画面,且流动成动画,颜色青蓝,且圈圈间距大

/(r**0.5)导致圈圈大

9

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r-(2*pi)*i/10)/(r**0.25)

write.gif (image, " cosr_sub_divr025.gif", col="rainbow"); z = read.gif(" cosr_sub_divr025.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

共10帧不同画面,且流动成动画,颜色绿和蓝,且圈圈间距大

/(r**0.25)导致圈圈大

10

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r-(2*pi)*i/10)/(r**0.1)

write.gif (image, " cosr_sub_divr01.gif", col="rainbow"); z = read.gif(" cosr_sub_divr01.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

共10帧不同画面,且流动成动画,颜色绿紫蓝,且圈圈间距大,条纹多

同上

11

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r-(2*pi)*i/10)/(r**0.01)

write.gif (image, " cosr_sub_divr001.gif", col="rainbow"); z = read.gif(" cosr_sub_divr001.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

共10帧不同画面,且流动成动画,颜色越来越红艳,条纹越来越多

颜色越来越红艳,条纹越来越多

12

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r-(2*pi)*i/10)/(r**0.001)

write.gif (image, " cosr_sub_divr0001.gif", col="rainbow"); z = read.gif(" cosr_sub_divr0001.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

同上一模一样

同上

13

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r-(pi)*i/10)/(r)

write.gif (image, " cosr_subpi_div.gif", col="rainbow"); z = read.gif(" cosr_subpi_div.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

共10帧不同画面,且流动成动画,颜色亮蓝,且圈圈极小

同7

14

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r-(pi)*i/10)/(r**0.25)

write.gif (image, " cosr_subpi_div025.gif", col="rainbow"); z = read.gif(" cosr_subpi_div025.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

同9

/(r**0.25)导致圈圈大,pi与2pi没影响

15

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r-(3.5*pi)*i/10)/(r**0.25)

write.gif (image, " cosr_sub35pi_div025.gif", col="rainbow");z = read.gif(" cosr_sub35pi_div025.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

同9,变得有些突兀

同上

16

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r-2*i/10)/(r**0.25)

write.gif (image, " cosr_sub2_div025.gif", col="rainbow");z = read.gif(" cosr_sub2_div025.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

同3,但是能动了

没有pi显得颜色红亮

17

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r-i/10)

write.gif (image, " cosr_subi10.gif", col="rainbow");z = read.gif(" cosr_subi10.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

共10帧不同画面,且流动成动画,棒棒糖红

cos(r-i/10)红且首尾帧不连贯

18

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r-i)

write.gif (image, " cosr_subi.gif", col="rainbow");z = read.gif(" cosr_subi.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

共10帧不同画面,且流动成动画,棒棒糖红同上

cos(r-i)波动很大,动得快

19

image = array(0, c(200, 200, 10));  for(i in 1:10) image[,,i] = cos(r-(2*pi)*i)

write.gif (image, " cosr_sub2pii.gif", col="rainbow");z = read.gif(" cosr_sub2pii.gif")

for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1)

共10帧相同画面,看起来像静图,棒棒糖红同上

静止不动,(2*pi)造成的周期

总结:

r为二维矩阵,cos(r)则可根据坐标信息做成同心圆,cos(2*pi+r)刚好是一个周期,

for(i in 1:10) cos(r+i)对圈与颜色有改动,for(i in 1:10) cos(r+2*pi*i)刚好是一个周期,2*pi*i/10则解决周期性问题,

除以r的函数,除数越大则圈形越小,除数越大则圈形越大;除以r幂级数越大则间距越大,幂级数小则间距密集。


  • 附录:绘制热力图:

r的热力图:

library(reshape2);  melt_r<-melt(r);library(ggplot2); ggplot( data=melt_r,aes(x=Var1, y=Var2, fill=value))+geom_tile()

  cos(r)的热力图:

melt_cosr<-melt(cos(r)); ggplot( data=melt_cosr,aes(x=Var1, y=Var2, fill=value))+geom_tile() #显然cos(r)值域为[-1,1]

  image[,,1:10]的热力图:

melt_image<-melt(image); ggplot( data=melt_image,aes(x=Var1, y=Var2, z=Var3, fill=value))+geom_tile()

解释:cos(r-(2*pi)*i/10)/(r**0.25) 对cos(r)进行移动拉伸后,max(melt_image$value)=1.821998; min(melt_image$value)=-1.821998

cos(r-(2*pi)*i/10)值域为[-1,1],因此/(r**0.25)造成纵坐标延展。

猜你喜欢

转载自blog.csdn.net/weixin_42683052/article/details/115495174