{"id":593,"date":"2019-05-04T01:10:26","date_gmt":"2019-05-04T06:10:26","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/nemo\/?p=593"},"modified":"2019-05-04T01:10:26","modified_gmt":"2019-05-04T06:10:26","slug":"animar_barras_1","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/nemo\/2019\/05\/04\/animar_barras_1\/","title":{"rendered":"Gr\u00e1fico barras animado: Primer intento"},"content":{"rendered":"<div id=\"header\" class=\"fluid-row\">\n<h1 class=\"title toc-ignore\">R Notebook: Gr\u00e1fico barras animado (Un primer intento)<\/h1>\n<\/div>\n<div id=\"objetivo\" class=\"section level2\">\n<h2>Objetivo<\/h2>\n<p>Se ha viralizado los gr\u00e1fico de barras horizontales que van mostrando un ranking (sea de ventas, valor de acciones, goles, etc.), y se muestra una animaci\u00f3n de c\u00f3mo cambia ese ranking por a\u00f1o o mes.<\/p>\n<\/div>\n<div id=\"preliminares\" class=\"section level2\">\n<h2>Preliminares<\/h2>\n<div id=\"datos\" class=\"section level3\">\n<h3>Datos<\/h3>\n<p>Vamos a crear una estructura b\u00e1sica en empresas comerciales:<br \/>\nALMACEN | PRODUCTO | PERIODO | VENTA.<\/p>\n<pre class=\"r\"><code>library(tidyverse)\r\nlibrary(lubridate)\r\nlibrary(ggplot2)\r\nlibrary(gganimate)\r\n\r\nset.seed(123)\r\ndf_1 &lt;- tbl_df( data.frame(\r\n  ALMACEN= rep(c(\"Mall del Sol\", \"Riocentro\"), each= 15),\r\n  PRODUCTO= paste(\"Prod\", LETTERS[1:15], sep=\"_\"),\r\n  PERIODO= rep(seq.Date(from=as.Date(\"2015-01-01\"), to=as.Date(\"2017-06-01\"), by=\"month\"), each=30),\r\n  VTA= round(runif(n = 900, min = 1000, max= 7000),0),\r\n  stringsAsFactors = FALSE\r\n) )\r\n\r\nglimpse(df_1)<\/code><\/pre>\n<pre><code>## Observations: 900\r\n## Variables: 4\r\n## $ ALMACEN  &lt;chr&gt; \"Mall del Sol\", \"Mall del Sol\", \"Mall del Sol\", \"Mall...\r\n## $ PRODUCTO &lt;chr&gt; \"Prod_A\", \"Prod_B\", \"Prod_C\", \"Prod_D\", \"Prod_E\", \"Pr...\r\n## $ PERIODO  &lt;date&gt; 2015-01-01, 2015-01-01, 2015-01-01, 2015-01-01, 2015...\r\n## $ VTA      &lt;dbl&gt; 2725, 5730, 3454, 6298, 6643, 1273, 4169, 6355, 4309,...<\/code><code><\/code><\/pre>\n<\/div>\n<div id=\"agrupamiento\" class=\"section level3\">\n<h3>Agrupamiento<\/h3>\n<p>Se va a realizar un ranking de los productos por mes, eso implica que necesitamos<\/p>\n<ol style=\"list-style-type: decimal\">\n<li>Calcular el total de venta mensual de cada producto (lo que implica hacer un arupamiento por Producto, periodo)<\/li>\n<li>Obtener el ranking de los productos por mes (para ello debemos hacer un agrupamiento por periodo)<\/li>\n<\/ol>\n<p>Usando el tidyverse ser\u00eda:<\/p>\n<pre class=\"r\"><code>df_resumen &lt;- df_1 %&gt;%\r\n  filter(year(PERIODO)== 2015) %&gt;% \r\n  group_by( PRODUCTO, PERIODO) %&gt;%  ## Agrupar por Producto, Periodo\r\n  summarise(VENTA= sum(VTA)) %&gt;%    ## Sumar la venta por Producto, Periodo\r\n  group_by( PERIODO) %&gt;%            ## Agrupar por  Periodo\r\n  mutate( RANKING= min_rank(-VENTA)) ## Obtener el ranking de prod por Periodo\r\nglimpse(df_resumen)<\/code><\/pre>\n<pre><code>## Observations: 180\r\n## Variables: 4\r\n## $ PRODUCTO &lt;chr&gt; \"Prod_A\", \"Prod_A\", \"Prod_A\", \"Prod_A\", \"Prod_A\", \"Pr...\r\n## $ PERIODO  &lt;date&gt; 2015-01-01, 2015-02-01, 2015-03-01, 2015-04-01, 2015...\r\n## $ VENTA    &lt;dbl&gt; 9124, 8611, 7312, 8126, 9846, 10287, 9838, 7263, 9993...\r\n## $ RANKING  &lt;int&gt; 8, 6, 10, 9, 2, 1, 3, 9, 4, 4, 1, 9, 10, 5, 15, 1, 6,...<\/code><\/pre>\n<\/div>\n<\/div>\n<div id=\"animacion\" class=\"section level2\">\n<h2>Animaci\u00f3n<\/h2>\n<div id=\"un-primer-grafico\" class=\"section level3\">\n<h3>Un primer gr\u00e1fico<\/h3>\n<p>Vamos a escoger un mes en espec\u00edfico y armar un gr\u00e1fico que ser\u00e1 el que animaremos, entendiendo la l\u00f3gica de ggplot2, requerimos:<br \/>\n1. En un eje el ranking (pero como el uno debe estar arriba, entonces lo ponemos en negativo), 2. En el otro eje la venta 3. Con esto se hace un gr\u00e1fico de barras 4. Los labels se los agrega con geom_text 5. El gr\u00e1fico de barras por default es vertical, pero lo queremos horizontal por lo que se hace un flip.<\/p>\n<pre class=\"r\"><code>ggplot(df_resumen %&gt;% filter(PERIODO==ymd(\"2015-01-01\")), aes(x = -RANKING, y = VENTA, fill = PRODUCTO)) +\r\n  geom_bar(stat = \"identity\") +\r\n  labs(title = \"Ranking de Productos\", subtitle = \"Mes: 2015-01-01\") +\r\n  geom_text(aes(label = PRODUCTO, y = VENTA + 750 ),\r\n            position =  position_dodge(0.9), vjust = 0.35) +\r\n  coord_flip()<\/code><\/pre>\n<div id=\"attachment_599\" style=\"width: 700px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-599\" class=\"size-full wp-image-599\" src=\"http:\/\/blog.espol.edu.ec\/nemo\/files\/2019\/05\/animacionBarras_01.png\" alt=\"\" width=\"700\" height=\"432\" srcset=\"https:\/\/blog.espol.edu.ec\/nemo\/files\/2019\/05\/animacionBarras_01.png 700w, https:\/\/blog.espol.edu.ec\/nemo\/files\/2019\/05\/animacionBarras_01-300x185.png 300w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><p id=\"caption-attachment-599\" class=\"wp-caption-text\">Primer gr\u00e1fico<\/p><\/div>\n<p>Lo pulimos un poco m\u00e1s y con esto tenemos nuestra base para la animaci\u00f3n<\/p>\n<pre class=\"r\"><code>ggplot(df_resumen %&gt;% filter(PERIODO==ymd(\"2015-01-01\")), aes(x = -RANKING, y = VENTA, fill = PRODUCTO)) +\r\n  geom_bar(stat = \"identity\") +\r\n  labs(title = \"Ranking de Productos\", subtitle = \"Mes: 2015-01-01\") +\r\n  geom_text(aes(label = PRODUCTO, y = VENTA + 750 ),\r\n            position =  position_stack(vjust = 1.01)) +\r\n  coord_flip() +\r\n  theme(axis.ticks.y=element_blank(), \r\n        axis.text.y=element_blank()) <\/code><\/pre>\n<div id=\"animacion-1\" class=\"section level3\">\n<div id=\"attachment_598\" style=\"width: 700px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-598\" class=\"size-full wp-image-598\" src=\"http:\/\/blog.espol.edu.ec\/nemo\/files\/2019\/05\/animacionBarras_02.png\" alt=\"\" width=\"700\" height=\"432\" srcset=\"https:\/\/blog.espol.edu.ec\/nemo\/files\/2019\/05\/animacionBarras_02.png 700w, https:\/\/blog.espol.edu.ec\/nemo\/files\/2019\/05\/animacionBarras_02-300x185.png 300w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><p id=\"caption-attachment-598\" class=\"wp-caption-text\">Gr\u00e1fico base para animaci\u00f3n<\/p><\/div>\n<h3>Animaci\u00f3n<\/h3>\n<p>La idea es generar un gr\u00e1fico por periodo, por lo que se define que los estados de la transici\u00f3n sea Periodo, n\u00f3tese la animaci\u00f3n en el subtitulo.<\/p>\n<pre class=\"r\"><code>gbar &lt;- ggplot(df_resumen, aes(x = -RANKING, y = VENTA, fill = PRODUCTO)) +\r\n  geom_bar(stat = \"identity\") +\r\n  labs(title = \"Ranking de Productos\", subtitle = \"Mes: {closest_state}\") +\r\n  geom_text(aes(label = PRODUCTO, y = VENTA + 750 ),\r\n            position =  position_stack(vjust = 1.01)) +\r\n  coord_flip() +\r\n  theme(axis.ticks.y=element_blank(), \r\n        axis.text.y=element_blank()) +\r\n  transition_states(states = PERIODO, transition_length = 2, state_length = 1) + \r\n  enter_fade() + \r\n  exit_shrink() +\r\n  ease_aes('sine-in-out')\r\n\r\ngbar_gif &lt;- animate(gbar, width = 940, height = 480)\r\n\r\ngbar_gif<\/code><\/pre>\n<p>El resultado es:<\/p>\n<div id=\"attachment_600\" style=\"width: 940px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-600\" class=\"size-full wp-image-600\" src=\"http:\/\/blog.espol.edu.ec\/nemo\/files\/2019\/05\/animacionBarras_final.gif\" alt=\"\" width=\"940\" height=\"480\" \/><p id=\"caption-attachment-600\" class=\"wp-caption-text\">Animaci\u00f3n final<\/p><\/div>\n<p>En esta entrada se ha usado geom_bar() para la animaci\u00f3n, pero podemos utilizar otra geometr\u00eda, eso se revisar\u00e1 en nuestra segunda aproximaci\u00f3n.<\/p>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<div id=\"header\" class=\"fluid-row\"> R Notebook: Gr\u00e1fico barras animado (Un primer intento) <\/div>\n<div id=\"objetivo\" class=\"section level2\"> Objetivo <\/p>\n<p>Se ha viralizado los gr\u00e1fico de barras horizontales que van mostrando un ranking (sea de ventas, valor de acciones, goles, etc.), y se muestra una animaci\u00f3n de c\u00f3mo cambia ese ranking por a\u00f1o o mes.<\/p>\n<\/p><\/div>\n<div id=\"preliminares\" &hellip; <\/p>\n<p><a class=\"more-link btn\" href=\"https:\/\/blog.espol.edu.ec\/nemo\/2019\/05\/04\/animar_barras_1\/\">Seguir leyendo<\/a><\/p>\n<\/div>\n","protected":false},"author":3803,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-593","post","type-post","status-publish","format-standard","hentry","category-sin-categoria","item-wrap"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/nemo\/wp-json\/wp\/v2\/posts\/593","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/nemo\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/nemo\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/nemo\/wp-json\/wp\/v2\/users\/3803"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/nemo\/wp-json\/wp\/v2\/comments?post=593"}],"version-history":[{"count":4,"href":"https:\/\/blog.espol.edu.ec\/nemo\/wp-json\/wp\/v2\/posts\/593\/revisions"}],"predecessor-version":[{"id":601,"href":"https:\/\/blog.espol.edu.ec\/nemo\/wp-json\/wp\/v2\/posts\/593\/revisions\/601"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/nemo\/wp-json\/wp\/v2\/media?parent=593"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/nemo\/wp-json\/wp\/v2\/categories?post=593"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/nemo\/wp-json\/wp\/v2\/tags?post=593"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}