A. LIBRARIES

Library installation

library(ggplot2)
library(pracma)
library(wesanderson)
library("gridExtra")

B. DATA BASE GENERATION

B.1. Import vectors

ImageJ scripts produce 3 vectors objects, each vector correspond to each axis: x, y and z. Now, we import these data to R enviroment.

vec.x <- as.numeric(read.csv(paste0(getwd(),"/result/R3_vec_x.csv"), sep="")[,1])
vec.y <- as.numeric(read.csv(paste0(getwd(),"/result/R3_vec_y.csv"), sep="")[,1])
vec.z <- as.numeric(read.csv(paste0(getwd(),"/result/R3_vec_z.csv"), sep="")[,1])

B.2. Data base generation

After import data, we create a data.frame to manage the data as unique object.

xyz <- data.frame(x = vec.x,
                  y = vec.y,
                  z = vec.z)
head(xyz)
dim(xyz)
[1] 2047523       3
xyz <- xyz[c(1:1000,5000:6000,10500:11000,20000:20500),]

B.3. Polar cordenates generation

To produce polar graph, we need to convert cartesians xyz cordenates to polar cordinates. We use cart2pol function of the pracma R package to produce polar cordenates object.

polar <- pracma::cart2pol(as.matrix(xyz))
head(polar)
        phi        r   z
1 0.6975257 2457.485 -17
2 0.6972644 2458.252 -17
3 0.6970032 2459.019 -17
4 0.6991465 2454.299 -17
5 0.6986224 2455.830 -17
6 0.6978375 2458.128 -17

B.4. Convert from radians to degrees

Function defined in ggplot R package need that angles are defined as degree, the we have to convert radians to degree with the formula: \[degree = \frac{180(radians)}{\pi}\] But cart2pol function give us radians between -1to +1, them we have to add before the conversion, them the formula is defined by: \[degree = \frac{180(radians+\pi)}{\pi}\]

polar[,1] <- (polar[,1] + pi) *180/pi
summary(polar)
      phi               r              z         
 Min.   : 50.38   Min.   :1935   Min.   :-17.00  
 1st Qu.:266.74   1st Qu.:2003   1st Qu.:-16.00  
 Median :268.72   Median :2435   Median :-14.00  
 Mean   :250.07   Mean   :2673   Mean   :-14.35  
 3rd Qu.:319.10   3rd Qu.:3623   3rd Qu.:-13.00  
 Max.   :324.18   Max.   :3689   Max.   :-12.00  

B.5. Format polar data base

To process data from polar data base we ahve to convert it to data.frame class object. We rename column to more easy manage in next steps.

polar <- as.data.frame(polar)
colnames(polar) <- c("degree", "value", "z")
head(polar)

C. GRAPHICS

C.1. Arrow graphs

Now, we use line plot from ggplot R package as first aproximation.

base <- ggplot(polar, aes(x=degree, y=value))
p <- base + coord_polar()
p+ geom_segment(aes(y=0, xend=degree, yend=value))

C.2. Density with colors graph

As second aproximation, we use a density graph to see where signal is more frecuent. NOTA: We can use color parameter to define groups

sp <- ggplot(xyz, aes(x=x, y=y, color=z)) +
  geom_point()
sp

C.3. Density with geom 2D density

We can add a count in the axis to gain information by each axis.

sp <- ggplot(xyz, aes(x=x, y=y)) +
  geom_point()
sp + geom_rug()

NA
NA

C.4. Density with geom 2D density GEOM

We can see the density of points like geom graph

sp + stat_density_2d(aes(fill = ..level..), geom="polygon")
sp

C.5. Change the gradient color of density graph ++++++

We can change color to define the intesity more easy.

sp + stat_density_2d(aes(fill = ..level..), geom="polygon")+
  scale_fill_gradient(low="blue", high="red")               

C.6. Elipses plots

One ellipse arround all points. We can cluster signal by their density with stat_ellipse parameter of ggplot function.

ggplot(xyz, aes(x, y))+
  geom_point()+
  stat_ellipse()

C.7. Ellipse by groups

We try to define differents groups from points density

p <- ggplot(xyz, aes(x, y, color = z))+
  geom_point()
p + stat_ellipse()

C.8. Change ellipse shape

Change the type of ellipses: possible values are “t”, “norm”, “euclid” a) “norm”

p + stat_ellipse(type = "norm")

  1. “t”
p + stat_ellipse(type = "t")

  1. “euclid”
p + stat_ellipse(type = "euclid")

C.9. Scatter plot with marginal density distribution plot

First we create a scatter plot of x and y variables with colors by groups. NOTA: We can use color parameter to define groups

library(wesanderson)
scatterPlot <- ggplot(xyz,aes(x, y, color=z)) +                 # cambiar los grupos por los grupos de animales 
  geom_point() + 
  # scale_color_manual(values = wes_palette(n=length(levels(as.factor(xyz$z))), name="Rushmore")) 
  theme(legend.position=c(0,1), legend.justification=c(0,1))
scatterPlot

Then we define marginal density plot of x (top panel)

xdensity <- ggplot(xyz, aes(x, fill=z)) + 
  geom_density(alpha=.5) + 
  scale_fill_manual(values = c('#999999','#E69F00')) + 
  theme(legend.position = "none")
xdensity

Later, we define marginal density plot of y (right panel)

ydensity <- ggplot(xyz, aes(y, fill=z)) + 
  geom_density(alpha=.5) + 
  scale_fill_manual(values = c('#999999','#E69F00')) + 
  theme(legend.position = "none")
ydensity

Now, we create a white plot to put over the other plots

blankPlot <- ggplot()+geom_blank(aes(1,1))+
  theme(plot.background = element_blank(), 
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(), 
        panel.border = element_blank(),
        panel.background = element_blank(),
        axis.title.x = element_blank(),
        axis.title.y = element_blank(),
        axis.text.x = element_blank(), 
        axis.text.y = element_blank(),
        axis.ticks = element_blank()
  )

Finally we put all plots together.

grid.arrange(xdensity, blankPlot, scatterPlot, ydensity, 
             ncol=2, nrow=2, widths=c(4, 1.4), heights=c(1.4, 4))

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIEEuIExJQlJBUklFUw0KTGlicmFyeSBpbnN0YWxsYXRpb24NCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwcmFjbWEpDQpsaWJyYXJ5KHdlc2FuZGVyc29uKQ0KbGlicmFyeSgiZ3JpZEV4dHJhIikNCmBgYA0KDQoNCiMgQi4gREFUQSBCQVNFIEdFTkVSQVRJT04gDQojIyBCLjEuIEltcG9ydCB2ZWN0b3JzDQpJbWFnZUogc2NyaXB0cyBwcm9kdWNlIDMgdmVjdG9ycyBvYmplY3RzLCBlYWNoIHZlY3RvciBjb3JyZXNwb25kIHRvIGVhY2ggYXhpczogeCwgeSBhbmQgei4NCk5vdywgd2UgaW1wb3J0IHRoZXNlIGRhdGEgdG8gUiBlbnZpcm9tZW50Lg0KYGBge3J9DQp2ZWMueCA8LSBhcy5udW1lcmljKHJlYWQuY3N2KHBhc3RlMChnZXR3ZCgpLCIvcmVzdWx0L1IzX3ZlY194LmNzdiIpLCBzZXA9IiIpWywxXSkNCnZlYy55IDwtIGFzLm51bWVyaWMocmVhZC5jc3YocGFzdGUwKGdldHdkKCksIi9yZXN1bHQvUjNfdmVjX3kuY3N2IiksIHNlcD0iIilbLDFdKQ0KdmVjLnogPC0gYXMubnVtZXJpYyhyZWFkLmNzdihwYXN0ZTAoZ2V0d2QoKSwiL3Jlc3VsdC9SM192ZWNfei5jc3YiKSwgc2VwPSIiKVssMV0pDQoNCmBgYA0KDQojIyBCLjIuIERhdGEgYmFzZSBnZW5lcmF0aW9uDQpBZnRlciBpbXBvcnQgZGF0YSwgd2UgY3JlYXRlIGEgZGF0YS5mcmFtZSB0byBtYW5hZ2UgdGhlIGRhdGEgYXMgdW5pcXVlIG9iamVjdC4NCmBgYHtyfQ0KeHl6IDwtIGRhdGEuZnJhbWUoeCA9IHZlYy54LA0KICAgICAgICAgICAgICAgICAgeSA9IHZlYy55LA0KICAgICAgICAgICAgICAgICAgeiA9IHZlYy56KQ0KaGVhZCh4eXopDQpkaW0oeHl6KQ0KeHl6IDwtIHh5eltjKDE6MTAwMCw1MDAwOjYwMDAsMTA1MDA6MTEwMDAsMjAwMDA6MjA1MDApLF0NCmBgYA0KDQoNCiMjIEIuMy4gUG9sYXIgY29yZGVuYXRlcyBnZW5lcmF0aW9uDQpUbyBwcm9kdWNlIHBvbGFyIGdyYXBoLCB3ZSBuZWVkIHRvIGNvbnZlcnQgY2FydGVzaWFucyB4eXogY29yZGVuYXRlcyB0byBwb2xhciBjb3JkaW5hdGVzLiBXZSB1c2UgKmNhcnQycG9sKiBmdW5jdGlvbiBvZiB0aGUgKnByYWNtYSogUiBwYWNrYWdlIHRvIHByb2R1Y2UgcG9sYXIgY29yZGVuYXRlcyBvYmplY3QuDQoNCmBgYHtyfQ0KcG9sYXIgPC0gcHJhY21hOjpjYXJ0MnBvbChhcy5tYXRyaXgoeHl6KSkNCmhlYWQocG9sYXIpDQpgYGANCg0KDQojIyBCLjQuIENvbnZlcnQgZnJvbSByYWRpYW5zIHRvIGRlZ3JlZXMNCkZ1bmN0aW9uIGRlZmluZWQgaW4gKmdncGxvdCogUiBwYWNrYWdlIG5lZWQgdGhhdCBhbmdsZXMgYXJlIGRlZmluZWQgYXMgZGVncmVlLCB0aGUgd2UgaGF2ZSB0byBjb252ZXJ0IHJhZGlhbnMgdG8gZGVncmVlIHdpdGggdGhlIGZvcm11bGE6DQokJGRlZ3JlZSA9IFxmcmFjezE4MChyYWRpYW5zKX17XHBpfSQkDQpCdXQgKmNhcnQycG9sKiBmdW5jdGlvbiBnaXZlIHVzIHJhZGlhbnMgYmV0d2VlbiAtMVxwaSB0byArMVxwaSwgdGhlbSB3ZSBoYXZlIHRvIGFkZCBccGkgYmVmb3JlIHRoZSBjb252ZXJzaW9uLCB0aGVtIHRoZSBmb3JtdWxhIGlzIGRlZmluZWQgYnk6DQokJGRlZ3JlZSA9IFxmcmFjezE4MChyYWRpYW5zK1xwaSl9e1xwaX0kJA0KDQoNCmBgYHtyfQ0KcG9sYXJbLDFdIDwtIChwb2xhclssMV0gKyBwaSkgKjE4MC9waQ0Kc3VtbWFyeShwb2xhcikNCmBgYA0KDQojIyBCLjUuIEZvcm1hdCBwb2xhciBkYXRhIGJhc2UNClRvIHByb2Nlc3MgZGF0YSBmcm9tICpwb2xhciogZGF0YSBiYXNlIHdlIGFodmUgdG8gY29udmVydCBpdCB0byBkYXRhLmZyYW1lIGNsYXNzIG9iamVjdC4gV2UgcmVuYW1lIGNvbHVtbiB0byBtb3JlIGVhc3kgbWFuYWdlIGluIG5leHQgc3RlcHMuDQpgYGB7cn0NCnBvbGFyIDwtIGFzLmRhdGEuZnJhbWUocG9sYXIpDQpjb2xuYW1lcyhwb2xhcikgPC0gYygiZGVncmVlIiwgInZhbHVlIiwgInoiKQ0KaGVhZChwb2xhcikNCmBgYA0KDQoNCiMgQy4gR1JBUEhJQ1MNCiMjIEMuMS4gQXJyb3cgZ3JhcGhzDQpOb3csIHdlIHVzZSAqbGluZSogcGxvdCBmcm9tICpnZ3Bsb3QqIFIgcGFja2FnZSBhcyBmaXJzdCBhcHJveGltYXRpb24uDQpgYGB7cn0NCmJhc2UgPC0gZ2dwbG90KHBvbGFyLCBhZXMoeD1kZWdyZWUsIHk9dmFsdWUpKQ0KcCA8LSBiYXNlICsgY29vcmRfcG9sYXIoKQ0KcCsgZ2VvbV9zZWdtZW50KGFlcyh5PTAsIHhlbmQ9ZGVncmVlLCB5ZW5kPXZhbHVlKSkNCg0KYGBgDQoNCiMjIEMuMi4gRGVuc2l0eSB3aXRoIGNvbG9ycyBncmFwaA0KQXMgc2Vjb25kIGFwcm94aW1hdGlvbiwgd2UgdXNlIGEgZGVuc2l0eSBncmFwaCB0byBzZWUgd2hlcmUgc2lnbmFsIGlzIG1vcmUgZnJlY3VlbnQuDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4qTk9UQSo6IFdlIGNhbiB1c2UgY29sb3IgcGFyYW1ldGVyIHRvIGRlZmluZSBncm91cHMgPC9zcGFuPg0KYGBge3J9DQpzcCA8LSBnZ3Bsb3QoeHl6LCBhZXMoeD14LCB5PXksIGNvbG9yPXopKSArDQogIGdlb21fcG9pbnQoKQ0Kc3ANCg0KYGBgDQoNCg0KIyMgQy4zLiBEZW5zaXR5IHdpdGggZ2VvbSAgMkQgZGVuc2l0eQ0KV2UgY2FuIGFkZCBhIGNvdW50IGluIHRoZSBheGlzIHRvIGdhaW4gaW5mb3JtYXRpb24gYnkgZWFjaCBheGlzLg0KYGBge3J9DQpzcCA8LSBnZ3Bsb3QoeHl6LCBhZXMoeD14LCB5PXkpKSArDQogIGdlb21fcG9pbnQoKQ0Kc3AgKyBnZW9tX3J1ZygpDQoNCg0KYGBgDQoNCiMjIEMuNC4gRGVuc2l0eSB3aXRoIGdlb20gIDJEIGRlbnNpdHkgR0VPTSANCldlIGNhbiBzZWUgdGhlIGRlbnNpdHkgb2YgcG9pbnRzIGxpa2UgZ2VvbSBncmFwaA0KDQpgYGB7cn0NCnNwICsgc3RhdF9kZW5zaXR5XzJkKGFlcyhmaWxsID0gLi5sZXZlbC4uKSwgZ2VvbT0icG9seWdvbiIpDQpzcA0KYGBgDQoNCg0KIyMgQy41LiBDaGFuZ2UgdGhlIGdyYWRpZW50IGNvbG9yIG9mIGRlbnNpdHkgZ3JhcGggKysrKysrICAgDQpXZSBjYW4gY2hhbmdlIGNvbG9yIHRvIGRlZmluZSB0aGUgaW50ZXNpdHkgbW9yZSBlYXN5Lg0KYGBge3J9DQpzcCArIHN0YXRfZGVuc2l0eV8yZChhZXMoZmlsbCA9IC4ubGV2ZWwuLiksIGdlb209InBvbHlnb24iKSsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3c9ImJsdWUiLCBoaWdoPSJyZWQiKSAgICAgICAgICAgICAgIA0KYGBgDQojIyBDLjYuIEVsaXBzZXMgcGxvdHMNCk9uZSBlbGxpcHNlIGFycm91bmQgYWxsIHBvaW50cy4gV2UgY2FuIGNsdXN0ZXIgc2lnbmFsIGJ5IHRoZWlyIGRlbnNpdHkgd2l0aCAqc3RhdF9lbGxpcHNlKiBwYXJhbWV0ZXIgb2YgKmdncGxvdCogZnVuY3Rpb24uDQpgYGB7cn0NCmdncGxvdCh4eXosIGFlcyh4LCB5KSkrDQogIGdlb21fcG9pbnQoKSsNCiAgc3RhdF9lbGxpcHNlKCkNCg0KYGBgDQoNCiMjIEMuNy4gRWxsaXBzZSBieSBncm91cHMNCldlIHRyeSB0byBkZWZpbmUgZGlmZmVyZW50cyBncm91cHMgZnJvbSBwb2ludHMgZGVuc2l0eQ0KYGBge3J9DQpwIDwtIGdncGxvdCh4eXosIGFlcyh4LCB5LCBjb2xvciA9IHopKSsNCiAgZ2VvbV9wb2ludCgpDQpwICsgc3RhdF9lbGxpcHNlKCkNCmBgYA0KDQojIyBDLjguIENoYW5nZSBlbGxpcHNlIHNoYXBlDQpDaGFuZ2UgdGhlIHR5cGUgb2YgZWxsaXBzZXM6IHBvc3NpYmxlIHZhbHVlcyBhcmUgInQiLCAibm9ybSIsICJldWNsaWQiDQphKSAibm9ybSINCmBgYHtyfQ0KcCArIHN0YXRfZWxsaXBzZSh0eXBlID0gIm5vcm0iKQ0KYGBgDQpiKSAidCINCmBgYHtyfQ0KcCArIHN0YXRfZWxsaXBzZSh0eXBlID0gInQiKQ0KYGBgDQpjKSAiZXVjbGlkIg0KYGBge3J9DQpwICsgc3RhdF9lbGxpcHNlKHR5cGUgPSAiZXVjbGlkIikNCmBgYA0KDQojIyBDLjkuIFNjYXR0ZXIgcGxvdCB3aXRoIG1hcmdpbmFsIGRlbnNpdHkgZGlzdHJpYnV0aW9uIHBsb3QgDQpGaXJzdCB3ZSBjcmVhdGUgYSBzY2F0dGVyIHBsb3Qgb2YgeCBhbmQgeSB2YXJpYWJsZXMgd2l0aCBjb2xvcnMgYnkgZ3JvdXBzLg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+Kk5PVEEqOiBXZSBjYW4gdXNlIGNvbG9yIHBhcmFtZXRlciB0byBkZWZpbmUgZ3JvdXBzIDwvc3Bhbj4NCg0KYGBge3J9DQpsaWJyYXJ5KHdlc2FuZGVyc29uKQ0Kc2NhdHRlclBsb3QgPC0gZ2dwbG90KHh5eixhZXMoeCwgeSwgY29sb3I9eikpICsgICAgICAgICAgICAgICAgICMgY2FtYmlhciBsb3MgZ3J1cG9zIHBvciBsb3MgZ3J1cG9zIGRlIGFuaW1hbGVzIA0KICBnZW9tX3BvaW50KCkgKyANCiAgIyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUobj1sZW5ndGgobGV2ZWxzKGFzLmZhY3Rvcih4eXokeikpKSwgbmFtZT0iUnVzaG1vcmUiKSkgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj1jKDAsMSksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uPWMoMCwxKSkNCnNjYXR0ZXJQbG90DQpgYGANClRoZW4gd2UgZGVmaW5lIG1hcmdpbmFsIGRlbnNpdHkgcGxvdCBvZiB4ICh0b3AgcGFuZWwpDQoNCmBgYHtyfQ0KeGRlbnNpdHkgPC0gZ2dwbG90KHh5eiwgYWVzKHgsIGZpbGw9eikpICsgDQogIGdlb21fZGVuc2l0eShhbHBoYT0uNSkgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygnIzk5OTk5OScsJyNFNjlGMDAnKSkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KeGRlbnNpdHkNCmBgYA0KDQpMYXRlciwgd2UgZGVmaW5lIG1hcmdpbmFsIGRlbnNpdHkgcGxvdCBvZiB5IChyaWdodCBwYW5lbCkNCg0KYGBge3J9DQp5ZGVuc2l0eSA8LSBnZ3Bsb3QoeHl6LCBhZXMoeSwgZmlsbD16KSkgKyANCiAgZ2VvbV9kZW5zaXR5KGFscGhhPS41KSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCcjOTk5OTk5JywnI0U2OUYwMCcpKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQp5ZGVuc2l0eQ0KYGBgDQpOb3csIHdlIGNyZWF0ZSBhIHdoaXRlIHBsb3QgdG8gcHV0IG92ZXIgdGhlIG90aGVyIHBsb3RzDQpgYGB7cn0NCmJsYW5rUGxvdCA8LSBnZ3Bsb3QoKStnZW9tX2JsYW5rKGFlcygxLDEpKSsNCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KYGBgDQoNCkZpbmFsbHkgd2UgcHV0IGFsbCBwbG90cyB0b2dldGhlci4NCmBgYHtyfQ0KZ3JpZC5hcnJhbmdlKHhkZW5zaXR5LCBibGFua1Bsb3QsIHNjYXR0ZXJQbG90LCB5ZGVuc2l0eSwgDQogICAgICAgICAgICAgbmNvbD0yLCBucm93PTIsIHdpZHRocz1jKDQsIDEuNCksIGhlaWdodHM9YygxLjQsIDQpKQ0KDQpgYGANCg0KDQo=