<p><div><div><div><div data-show-faces="false" data-height="21" data-width="100" data-layout="button_count" data-send="true" data-href="https://www.r-bloggers.com/i-made-a-3d-movie-with-ggplot2-once-heres-how-i-did-it/"></div></div><div></div></div><div></div></div>
<div>
(This article was first published on <strong><a href="http://www.data-imaginist.com/2017/I-made-a-3D-movie/"> Data Imaginist - R posts</a></strong>, and kindly contributed to <a rel="nofollow" href="https://www.r-bloggers.com/">R-bloggers)</a> </div>
<p>Some time ago (last year actually <img alt="😳" src="https://s.w.org/images/core/emoji/2/72x72/1f633.png" class="wp-smiley">) I had a blast<br>
developing a feature for <code>ggforce</code> which had been on my mind for far to long than<br>
its limited utility warranted. The idea was to showcase the new facetting<br>
extension powers I’d added to <code>ggplot2</code> by making a facetting function that<br>
created a stereoscopic pair of plots that would simulate 3D. To procrastinate<br>
and show off I made a little animated video with the feature and posted it on<br>
Twitter, promising I’d write about it someday. Now (again, one year later), I<br>
think the world is finally ready to see what went through my R console to make<br>
that little animation. While I’ve been very timely with this blog post, the<br>
feature is still not available on CRAN, so you’ll need to install the GitHub<br>
version of <code>ggforce</code> to follow along.</p>
<figure>
<pre><code data-lang="r"><span>devtools</span><span>::</span><span>install_github</span><span>(</span><span>'thomasp85/ggforce'</span><span>)</span></code></pre>
</figure>
<h2>Setup</h2>
<p>The goal is to create a spinning hollow cube so we’ll need to define the cube<br>
somehow. This was way before <code>ggraph</code> was published, and <code>tidygraph</code> was not<br>
even a thought in my head, so while it may make sense to handle the cube as a<br>
network, I did it the hard way:</p>
<figure>
<pre><code data-lang="r"><span>library</span><span>(</span><span>ggplot2</span><span>)</span><span>
</span><span>library</span><span>(</span><span>ggforce</span><span>)</span><span>
</span><span># Define the corners of the cube
</span><span>cube</span><span> </span><span>&lt;-</span><span> </span><span>matrix</span><span>(</span><span>
</span><span>c</span><span>(</span><span>
</span><span>1</span><span>,</span><span> </span><span>1</span><span>,</span><span> </span><span>1</span><span>,</span><span>
</span><span>1</span><span>,</span><span> </span><span>-1</span><span>,</span><span> </span><span>1</span><span>,</span><span>
</span><span>-1</span><span>,</span><span> </span><span>-1</span><span>,</span><span> </span><span>1</span><span>,</span><span>
</span><span>-1</span><span>,</span><span> </span><span>1</span><span>,</span><span> </span><span>1</span><span>,</span><span>
</span><span>1</span><span>,</span><span> </span><span>1</span><span>,</span><span> </span><span>-1</span><span>,</span><span>
</span><span>1</span><span>,</span><span> </span><span>-1</span><span>,</span><span> </span><span>-1</span><span>,</span><span>
</span><span>-1</span><span>,</span><span> </span><span>-1</span><span>,</span><span> </span><span>-1</span><span>,</span><span>
</span><span>-1</span><span>,</span><span> </span><span>1</span><span>,</span><span> </span><span>-1</span><span>
</span><span>),</span><span>
</span><span>ncol</span><span> </span><span>=</span><span> </span><span>3</span><span>,</span><span> </span><span>byrow</span><span> </span><span>=</span><span> </span><span>TRUE</span><span>
</span><span>)</span><span>
</span><span># Define each edge - practically making a network the hard way
</span><span>segments</span><span> </span><span>&lt;-</span><span> </span><span>data.frame</span><span>(</span><span>
</span><span>ind</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>3</span><span>,</span><span> </span><span>3</span><span>,</span><span> </span><span>4</span><span>,</span><span> </span><span>4</span><span>,</span><span> </span><span>1</span><span>,</span><span> </span><span>5</span><span>,</span><span> </span><span>6</span><span>,</span><span> </span><span>6</span><span>,</span><span> </span><span>7</span><span>,</span><span> </span><span>7</span><span>,</span><span> </span><span>8</span><span>,</span><span> </span><span>8</span><span>,</span><span> </span><span>5</span><span>,</span><span> </span><span>1</span><span>,</span><span> </span><span>5</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>6</span><span>,</span><span> </span><span>3</span><span>,</span><span> </span><span>7</span><span>,</span><span> </span><span>4</span><span>,</span><span> </span><span>8</span><span>),</span><span>
</span><span>group</span><span> </span><span>=</span><span> </span><span>rep</span><span>(</span><span>1</span><span>:</span><span>12</span><span>,</span><span> </span><span>each</span><span> </span><span>=</span><span> </span><span>2</span><span>)</span><span>
</span><span>)</span></code></pre>
</figure>
<p>Now that we have our data, we need to create some transformation functions.<br>
Currently, if plotted in <code>ggplot2</code> it would just look like a square as,<br>
unsurprisingly, the third dimension would get lost. What we need is a<br>
<em>projection</em> of three dimension down to two. This is a bit hairy, and when I<br>
tried to achieve this back in the days by setting up a transformation matrix<br>
manually I failed miserably (if you are knowledgable in this and want to explain<br>
it to me – please reach out on twitter). In the end I took the shortcut and used<br>
the <code>persp()</code> function, which, besides the side effect of plotting stuff in 3D,<br>
also returns the transformation matrix invisibly:</p>
<figure>
<pre><code data-lang="r"><span>tr_mat</span><span> </span><span>&lt;-</span><span> </span><span>persp</span><span>(</span><span>z</span><span> </span><span>=</span><span> </span><span>cube</span><span>,</span><span> </span><span>theta</span><span> </span><span>=</span><span> </span><span>0</span><span>,</span><span> </span><span>phi</span><span> </span><span>=</span><span> </span><span>0</span><span>,</span><span> </span><span>xlim</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>-2</span><span>,</span><span> </span><span>2</span><span>),</span><span> </span><span>ylim</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>-2</span><span>,</span><span> </span><span>2</span><span>),</span><span> </span><span>zlim</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>-2</span><span>,</span><span>2</span><span>))</span></code></pre>
</figure>
<p>Having a look at the transformation matrix I can safely say that I have no idea<br>
what’s going on:</p>
<figure>
<pre><code data-lang="r"><span>tr_mat</span></code></pre>
</figure>
<figure>
<pre><code data-lang="text">#>      [,1]         [,2]          [,3]          [,4]
#> [1,]  0.5 0.000000e+00  0.000000e+00  0.000000e+00
#> [2,]  0.0 3.061617e-17 -5.000000e-01  5.000000e-01
#> [3,]  0.0 5.000000e-01  3.061617e-17 -3.061617e-17
#> [4,]  0.0 0.000000e+00 -2.732051e+00  3.732051e+00</code></pre>
</figure>
<p>But that doesn’t matter – the only thing required is that I know how to use it.<br>
The <code>trans3d()</code> provides the means for taking in three dimensional points, and a<br>
transformation matrix, and outputting two dimensional points:</p>
<figure>
<pre><code data-lang="r"><span>trans_cube</span><span> </span><span>&lt;-</span><span> </span><span>trans3d</span><span>(</span><span>cube</span><span>[,</span><span>1</span><span>],</span><span> </span><span>cube</span><span>[,</span><span>2</span><span>],</span><span> </span><span>cube</span><span>[,</span><span>3</span><span>],</span><span> </span><span>tr_mat</span><span>)</span><span>
</span><span>ggplot</span><span>(</span><span>as.data.frame</span><span>(</span><span>trans_cube</span><span>))</span><span> </span><span>+</span><span> </span><span>geom_point</span><span>(</span><span>aes</span><span>(</span><span>x</span><span>,</span><span> </span><span>y</span><span>))</span></code></pre>
</figure>
<p><img alt="center" src="https://i0.wp.com/www.data-imaginist.com/assets/images/2017-08-18-I-made-a-3D-movie/unnamed-chunk-6-1.png?w=456" data-recalc-dims="1"></p>
<p>With a bit of imagination we can see the 3D cube. Lets draw it with line<br>
segments as well – we add the added information of depth, which is simply the<br>
value in the dimension that gets dropped in the transformation.</p>
<figure>
<pre><code data-lang="r"><span>to_grid</span><span> </span><span>&lt;-</span><span> </span><span>function</span><span>(</span><span>mat</span><span>,</span><span> </span><span>segments</span><span>,</span><span> </span><span>tr_mat</span><span>)</span><span> </span><span>{</span><span>
</span><span>trans</span><span> </span><span>&lt;-</span><span> </span><span>trans3d</span><span>(</span><span>mat</span><span>[,</span><span> </span><span>1</span><span>],</span><span> </span><span>mat</span><span>[,</span><span> </span><span>2</span><span>],</span><span> </span><span>mat</span><span>[,</span><span> </span><span>3</span><span>],</span><span> </span><span>tr_mat</span><span>)</span><span>
</span><span>cube</span><span> </span><span>&lt;-</span><span> </span><span>cbind</span><span>(</span><span>as.data.frame</span><span>(</span><span>trans</span><span>),</span><span> </span><span>depth</span><span> </span><span>=</span><span> </span><span>-</span><span>mat</span><span>[,</span><span> </span><span>2</span><span>])</span><span>
</span><span>cbind</span><span>(</span><span>cube</span><span>[</span><span>segments</span><span>$</span><span>ind</span><span>,</span><span> </span><span>],</span><span> </span><span>segments</span><span>)</span><span>
</span><span>}</span><span>
</span><span>cube_grid</span><span> </span><span>&lt;-</span><span> </span><span>to_grid</span><span>(</span><span>cube</span><span>,</span><span> </span><span>segments</span><span>,</span><span> </span><span>tr_mat</span><span>)</span><span>
</span><span>ggplot</span><span>(</span><span>cube_grid</span><span>)</span><span> </span><span>+</span><span> </span><span>geom_path</span><span>(</span><span>aes</span><span>(</span><span>x</span><span>,</span><span> </span><span>y</span><span>,</span><span> </span><span>group</span><span> </span><span>=</span><span> </span><span>group</span><span>))</span></code></pre>
</figure>
<p><img alt="center" src="https://i0.wp.com/www.data-imaginist.com/assets/images/2017-08-18-I-made-a-3D-movie/unnamed-chunk-7-1.png?w=456" data-recalc-dims="1"></p>
<p>We can of course improve the illusion even more. Using <code>geom_link2()</code> from<br>
<code>ggforce</code>, we can add a gradient size to the lines, based on the depth of the<br>
endpoints (remember, these were added in the <code>to_grid()</code> function).</p>
<figure>
<pre><code data-lang="r"><span>ggplot</span><span>(</span><span>cube_grid</span><span>)</span><span> </span><span>+</span><span> </span><span>geom_link2</span><span>(</span><span>aes</span><span>(</span><span>x</span><span>,</span><span> </span><span>y</span><span>,</span><span> </span><span>group</span><span> </span><span>=</span><span> </span><span>group</span><span>,</span><span> </span><span>size</span><span> </span><span>=</span><span> </span><span>depth</span><span>),</span><span> </span><span>lineend</span><span> </span><span>=</span><span> </span><span>'round'</span><span>,</span><span> </span><span>n</span><span> </span><span>=</span><span> </span><span>500</span><span>)</span><span> </span><span>+</span><span> </span><span>scale_size</span><span>(</span><span>range</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>1.5</span><span>,</span><span> </span><span>3</span><span>))</span></code></pre>
</figure>
<p><img alt="center" src="https://i1.wp.com/www.data-imaginist.com/assets/images/2017-08-18-I-made-a-3D-movie/unnamed-chunk-8-1.png?w=456" data-recalc-dims="1"></p>
<p>What can we do more? Well, we could decide to rotate it a bit. Let’s, make a<br>
function that rotates it around the vertical axis:</p>
<figure>
<pre><code data-lang="r"><span>rot</span><span> </span><span>&lt;-</span><span> </span><span>function</span><span>(</span><span>mat</span><span>,</span><span> </span><span>angle</span><span>)</span><span> </span><span>{</span><span>
</span><span>mat_tmp</span><span> </span><span>&lt;-</span><span> </span><span>mat</span><span>
</span><span>mat_tmp</span><span>[,</span><span>1</span><span>]</span><span> </span><span>&lt;-</span><span> </span><span>mat</span><span>[,</span><span>1</span><span>]</span><span> </span><span>*</span><span> </span><span>cos</span><span>(</span><span>angle</span><span>)</span><span> </span><span>-</span><span> </span><span>mat</span><span>[,</span><span>2</span><span>]</span><span> </span><span>*</span><span> </span><span>sin</span><span>(</span><span>angle</span><span>)</span><span>
</span><span>mat_tmp</span><span>[,</span><span>2</span><span>]</span><span> </span><span>&lt;-</span><span> </span><span>mat</span><span>[,</span><span>2</span><span>]</span><span> </span><span>*</span><span> </span><span>cos</span><span>(</span><span>angle</span><span>)</span><span> </span><span>+</span><span> </span><span>mat</span><span>[,</span><span>1</span><span>]</span><span> </span><span>*</span><span> </span><span>sin</span><span>(</span><span>angle</span><span>)</span><span>
</span><span>mat_tmp</span><span>
</span><span>}</span><span>
</span><span>cube_grid</span><span> </span><span>&lt;-</span><span> </span><span>to_grid</span><span>(</span><span>rot</span><span>(</span><span>cube</span><span>,</span><span> </span><span>pi</span><span>/</span><span>4.5</span><span>),</span><span> </span><span>segments</span><span>,</span><span> </span><span>tr_mat</span><span>)</span><span>
</span><span>ggplot</span><span>(</span><span>cube_grid</span><span>)</span><span> </span><span>+</span><span> </span><span>geom_link2</span><span>(</span><span>aes</span><span>(</span><span>x</span><span>,</span><span> </span><span>y</span><span>,</span><span> </span><span>group</span><span> </span><span>=</span><span> </span><span>group</span><span>,</span><span> </span><span>size</span><span> </span><span>=</span><span> </span><span>depth</span><span>),</span><span> </span><span>lineend</span><span> </span><span>=</span><span> </span><span>'round'</span><span>,</span><span> </span><span>n</span><span> </span><span>=</span><span> </span><span>500</span><span>)</span><span> </span><span>+</span><span> </span><span>scale_size</span><span>(</span><span>range</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>1.5</span><span>,</span><span> </span><span>3</span><span>))</span></code></pre>
</figure>
<p><img alt="center" src="https://i1.wp.com/www.data-imaginist.com/assets/images/2017-08-18-I-made-a-3D-movie/unnamed-chunk-9-1.png?w=456" data-recalc-dims="1"></p>
<p>We now have all the ingredients to make an animation of a spinning cube – we<br>
really only need to animate a 90 degree spin as it is selfrepeating. For added<br>
fiz we’ll improve the depth perception by simulating a bit of haze by greying<br>
parts more distant:</p>
<figure>
<pre><code data-lang="r"><span>angles</span><span> </span><span>&lt;-</span><span> </span><span>head</span><span>(</span><span>seq</span><span>(</span><span>0</span><span>,</span><span> </span><span>pi</span><span>/</span><span>2</span><span>,</span><span> </span><span>length.out</span><span> </span><span>=</span><span> </span><span>51</span><span>),</span><span> </span><span>50</span><span>)</span><span>
</span><span>cubes</span><span> </span><span>&lt;-</span><span> </span><span>lapply</span><span>(</span><span>angles</span><span>,</span><span> </span><span>function</span><span>(</span><span>i</span><span>)</span><span> </span><span>to_grid</span><span>(</span><span>rot</span><span>(</span><span>cube</span><span>,</span><span> </span><span>i</span><span>),</span><span> </span><span>segments</span><span>,</span><span> </span><span>tr_mat</span><span>))</span><span>
</span><span>for</span><span> </span><span>(</span><span>d</span><span> </span><span>in</span><span> </span><span>cubes</span><span>)</span><span> </span><span>{</span><span>
</span><span>p</span><span> </span><span>&lt;-</span><span> </span><span>ggplot</span><span>(</span><span>d</span><span>)</span><span> </span><span>+</span><span> </span><span>geom_link2</span><span>(</span><span>aes</span><span>(</span><span>x</span><span>,</span><span> </span><span>y</span><span>,</span><span> </span><span>group</span><span> </span><span>=</span><span> </span><span>group</span><span>,</span><span> </span><span>size</span><span> </span><span>=</span><span> </span><span>depth</span><span>,</span><span> </span><span>color</span><span> </span><span>=</span><span> </span><span>depth</span><span>),</span><span> </span><span>lineend</span><span> </span><span>=</span><span> </span><span>'round'</span><span>,</span><span> </span><span>n</span><span> </span><span>=</span><span> </span><span>500</span><span>)</span><span> </span><span>+</span><span> </span><span>scale_size</span><span>(</span><span>range</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>1.5</span><span>,</span><span> </span><span>3</span><span>))</span><span> </span><span>+</span><span> </span><span>scale_color_gradient</span><span>(</span><span>low</span><span> </span><span>=</span><span> </span><span>'grey70'</span><span>,</span><span> </span><span>high</span><span> </span><span>=</span><span> </span><span>'black'</span><span>)</span><span> </span><span>+</span><span> </span><span>scale_x_continuous</span><span>(</span><span>limits</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>-0.4</span><span>,</span><span> </span><span>0.4</span><span>))</span><span> </span><span>+</span><span> </span><span>scale_y_continuous</span><span>(</span><span>limits</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>-0.4</span><span>,</span><span> </span><span>0.4</span><span>))</span><span> </span><span>+</span><span> </span><span>coord_fixed</span><span>()</span><span> </span><span>+</span><span> </span><span>theme</span><span>(</span><span>legend.position</span><span> </span><span>=</span><span> </span><span>'none'</span><span>)</span><span>
</span><span>plot</span><span>(</span><span>p</span><span>)</span><span>
</span><span>}</span></code></pre>
</figure>
<p><img alt="unnamed-chunk-10" src="https://i1.wp.com/www.data-imaginist.com/assets/images/2017-08-18-I-made-a-3D-movie/unnamed-chunk-10-.gif?w=456" data-recalc-dims="1"></p>
<p>That’s all fine and well, but this is just a regular and boring 2D video. Let us<br>
update it to the brave new world, where Avatar has taught us that 3D is not<br>
tacky: Enter <code>facet_stereo()</code>.</p>
<figure>
<pre><code data-lang="r"><span>for</span><span> </span><span>(</span><span>d</span><span> </span><span>in</span><span> </span><span>cubes</span><span>)</span><span> </span><span>{</span><span>
</span><span>p</span><span> </span><span>&lt;-</span><span> </span><span>ggplot</span><span>(</span><span>d</span><span>)</span><span> </span><span>+</span><span> </span><span>geom_link2</span><span>(</span><span>aes</span><span>(</span><span>x</span><span>,</span><span> </span><span>y</span><span>,</span><span> </span><span>group</span><span> </span><span>=</span><span> </span><span>group</span><span>,</span><span> </span><span>size</span><span> </span><span>=</span><span> </span><span>depth</span><span>,</span><span> </span><span>color</span><span> </span><span>=</span><span> </span><span>depth</span><span>,</span><span>
</span><span>depth</span><span> </span><span>=</span><span> </span><span>depth</span><span>),</span><span> </span><span># This tells facet_stereo about depth
</span><span> </span><span>lineend</span><span> </span><span>=</span><span> </span><span>'round'</span><span>,</span><span> </span><span>n</span><span> </span><span>=</span><span> </span><span>500</span><span>)</span><span> </span><span>+</span><span> </span><span>scale_size</span><span>(</span><span>range</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>1.5</span><span>,</span><span> </span><span>3</span><span>))</span><span> </span><span>+</span><span> </span><span>scale_color_gradient</span><span>(</span><span>low</span><span> </span><span>=</span><span> </span><span>'grey70'</span><span>,</span><span> </span><span>high</span><span> </span><span>=</span><span> </span><span>'black'</span><span>)</span><span> </span><span>+</span><span> </span><span>scale_x_continuous</span><span>(</span><span>limits</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>-0.4</span><span>,</span><span> </span><span>0.4</span><span>))</span><span> </span><span>+</span><span> </span><span>scale_y_continuous</span><span>(</span><span>limits</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>-0.4</span><span>,</span><span> </span><span>0.4</span><span>))</span><span> </span><span>+</span><span> </span><span>coord_fixed</span><span>()</span><span> </span><span>+</span><span> </span><span>theme</span><span>(</span><span>legend.position</span><span> </span><span>=</span><span> </span><span>'none'</span><span>)</span><span> </span><span>+</span><span> </span><span>scale_depth</span><span>(</span><span>range</span><span> </span><span>=</span><span> </span><span>c</span><span>(</span><span>0</span><span>,</span><span> </span><span>0.15</span><span>))</span><span> </span><span>+</span><span> </span><span># This scales depth perception
</span><span> </span><span>facet_stereo</span><span>(</span><span>panel.size</span><span> </span><span>=</span><span> </span><span>200</span><span>)</span><span> </span><span># This calculates the stereoscopic distortion
</span><span> </span><span>plot</span><span>(</span><span>p</span><span>)</span><span>
</span><span>}</span></code></pre>
</figure>
<p><img alt="unnamed-chunk-11" src="https://i0.wp.com/www.data-imaginist.com/assets/images/2017-08-18-I-made-a-3D-movie/unnamed-chunk-11-.gif?w=456" data-recalc-dims="1"></p>
<p>That is all it takes…</p>
	<p>
<div>
<div>To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="http://www.data-imaginist.com/2017/I-made-a-3D-movie/"> Data Imaginist - R posts</a></strong>.</div>
<hr>
<a rel="nofollow" href="https://www.r-bloggers.com/">R-bloggers.com</a> offers <strong><a rel="nofollow" href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers">daily e-mail updates</a></strong> about <a rel="nofollow" href="https://www.r-project.org/" title="The R Project for Statistical Computing">R</a> news and <a rel="nofollow" href="https://www.r-bloggers.com/search/tutorial" title="R tutorials">tutorials</a> on topics such as: <a rel="nofollow" href="https://www.r-bloggers.com/search/data%20science" title="Data science">Data science</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/Big%20Data" title="Big Data">Big Data, <a rel="nofollow" href="https://www.r-users.com/" title="R jobs">R jobs</a>, visualization (<a rel="nofollow" href="https://www.r-bloggers.com/search/ggplot2" title="ggplot and ggplot2 tutorials">ggplot2</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/boxplot" title="Boxplots using lattice and ggplot2 tutorials">Boxplots</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/map" title="Maps and gis">maps</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/animation" title="Animation in R">animation</a>), programming (<a rel="nofollow" href="https://www.r-bloggers.com/search/RStudio" title="RStudio IDE for R">RStudio</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/sweave" title="Sweave and literate programming">Sweave</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/LaTeX" title="LaTeX in R">LaTeX</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/SQL" title="SQL and databases">SQL</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/eclipse" title="Eclipse IDE for R">Eclipse</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/git" title="git and github, Version Control System">git</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/hadoop" title="Large data in R using Hadoop">hadoop</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/Web+Scraping" title="Web Scraping of google, facebook, yahoo, twitter and more using R">Web Scraping</a>) statistics (<a rel="nofollow" href="https://www.r-bloggers.com/search/regression" title="Regressions and ANOVA analysis tutorials">regression</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/PCA" title="principal component analysis tutorial">PCA</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/time+series" title="Time series">time series</a>, <a rel="nofollow" href="https://www.r-bloggers.com/search/trading" title="finance trading">trading</a>) and more...
<img width="1" alt="" src="http://feeds.feedburner.com/~r/RBloggers/~4/AKPlWojgdsY" height="1"></a></div>