Skip to content

[R-es] Ayuda con gráfico típico de histograma más linea

11 messages · Carlos J. Gil Bellosta, Ruben Tobalina Ramirez, Carlos Ortega

#
Buenas tardes,

Tengo una duda con gráficos. Estoy intentando realizar el típico gráfico de
una variable en histograma y otra en linea, supongo que será sencillo pero
llevo unos días peleando y no me sale de forma correcta.

Las variables están en un dataframe que muestran las frecuencias de tweets
minuto a minuto y el share de esos minutos (os adjunto un archivo en csv
con el dataframe).

Una muestra del data frame:








*   hora frec Miles Share  1 20:22   87 1.016
13,0
2 20:23  123 1.031  13,33 20:24  153 1.048  13,5  4 20:25  192 1.165  15,0
5 20:26  175 1.239  15,8 6 20:27  225 1.331  17,0    *

He probado con *plot* y el parámetro *new* sin éxito, y ahora estaba
probando con *ggplot*:



*ggplot(ft, aes(ft[,2:3])) +   geom_bar(aes(ft[,2]), colour="black", fill =
"orange") +   geom_line(aes(x=ft$hora,y=ft[,3]), colour="black") *

Se me muestran las variables pero de forma incorrecta. ¿Alguna sugerencia?
De paso, me podéis indicar algún manual para aprender a realizar gráficos
con R?

Muchas gracias!

Un saludo!!!
#
Hola,

Aproximación muy sencillita...con gráficos "base":

#-----------------

datIn <- read.csv("pec.csv", header = TRUE, sep = ";", dec = ",")

par(mfrow = c(2,1))
barplot(
          datIn$frec
         ,las = 1
         ,col = "green"
         ,cex.axis = 0.7, col.axis = "red", font.axis = 2
         ,main = "Frequency"
        )
box()
plot(
      datIn$Share
     ,type = "b"
     ,col = "blue", bg = "blue", col.axis = "red", font.axis = 2
     ,cex = 0.7
     ,cex.axis = 0.7
     ,las = 1
     ,main = "Share", ylab = "", xlab = ""
     ,ylim = c(0, 1.10*max(datIn$Share))
    )

#-----------------

Yo haría la representación por separado, mejor que un gráfico con doble eje.
Pero si quieres hacer un gráfico de doble eje:
http://ellisp.github.io/blog/2016/08/28/dualaxes2

Y como referencia para hacer gráficos (en español):
https://www.amazon.es/Gráficos-Estadísticos-Castor-Guisande-González/dp/8499692117/ref=sr_1_1?ie=UTF8&qid=1472845192&sr=8-1&keywords=graficos+en+R
<https://www.amazon.es/Gr%C3%A1ficos-Estad%C3%ADsticos-Castor-Guisande-Gonz%C3%A1lez/dp/8499692117/ref=sr_1_1?ie=UTF8&qid=1472845192&sr=8-1&keywords=graficos+en+R>

Nota: Si quieres incluir las horas minutos en el eje "X" de cualquiera de
los dos gráficos:
http://stackoverflow.com/questions/5182238/r-replace-x-axis-with-own-values

Saludos,
Carlos Ortega
www.qualityexcellence.es


El 2 de septiembre de 2016, 20:25, Ruben Tobalina Ramirez <
lagrimaescrita en gmail.com> escribió:

  
    
#
Y bueno, algo más bonito sí que queda con ggplot...

#---------------
datIn <- read.csv("pec.csv", header = TRUE, sep = ";", dec = ",")

library(ggplot2)
lab_x_idx <- c(1, round(nrow(datIn)/2, 0), nrow(datIn))
lab_x <- as.vector(datIn$hora[ lab_x_idx])
fre_gg <- ggplot( datIn, aes( x = 1:nrow(datIn),   y = frec)) +
             geom_bar(stat = "identity") +
             xlab(paste("Rango horas: ", datIn$hora[1], "-",
datIn$hora[nrow(datIn)], sep = "") ) +
             ylab("Frecuencia") +
             scale_x_continuous( breaks = lab_x_idx, labels = lab_x ) +
             theme_minimal()
sha_gg <- ggplot( datIn , aes(x = 1:nrow(datIn), y = Share)) +
                 geom_line() +
                 xlab(paste("Rango horas: ", datIn$hora[1], "-",
datIn$hora[nrow(datIn)], sep = "") ) +
                 ylab("Share") +
                 ylim(0, max(datIn$Share)*1.10) +
                 scale_x_continuous( breaks = lab_x_idx, labels = lab_x ) +
                 theme_minimal()
library(gridExtra)
grid.arrange(fre_gg, sha_gg, nrow=2, ncol=1)

#---------------

Saludos,
Carlos Ortega
www.qualityexcellence.es



El 2 de septiembre de 2016, 21:47, Carlos Ortega <cof en qualityexcellence.es>
escribió:

  
    
#
Buenas tardes!

uau! Muchas gracias!! He estado trabajando esta mañana y no he podido
responder antes, aunque esta madrugada antes de ir a currar los he probado.
Es sorprende como R saca de quicio, probé tus scripts con el csv que mandé
y va perfecto. Luego pruebo con mis datos - haciendo los cambios
correspondientes - y R me fusila a errores:D

De hecho el segundo gráfico - el del share - no sale con los consiguientes
errores -dependiendo la la variable que use (Share o miles):



*Error: Discrete value supplied to continuous scalegeom_path: Each group
consists of only one observation. Do you need to adjust the groupaesthetic?*

Modifique el código tal que así:

ggbar<-ggplot(ft, aes(x=ft$hora, y=ft$frec)) +
  geom_bar(stat="identity", width = 0.8, fill="gray") +
  theme(panel.background = element_rect(fill = "white")) +
  scale_y_continuous(limits=c(0,1500))
ggline<-ggplot(ft, aes(x=ft$hora, y=ft$Miles)) +
  geom_line()+
  theme(panel.background = element_rect(fill = "white")) +
  scale_y_continuous(limits=c(0,1500))

library(gridExtra)
grid.arrange(ggbar, ggline, nrow=2, ncol=1)

No entendí muy bien por qué no indicabas en el eje x las horas. Entiendo
que esta hecho a propósito, y por eso supongo que me da el primer error,
pero no entiendo porque. Gráficando por ejemplo los tweets no hay problema:
[image: Imágenes integradas 2]

Por cierto, hay alguna forma que no sea poniendo "a mano" como indicabas en
el correo, de poner los minutos más claro, a lo mejor de 5 en 5, o algo así?

Un saludo!


El 3 de septiembre de 2016, 0:12, Carlos Ortega <cof en qualityexcellence.es>
escribió:

  
    
#
Prueba algo así:

library(ggplot2)

datos <- read.table("Downloads/pec.csv", header = T, sep = ";", dec = ",")
datos$Miles <- as.numeric(gsub("\\.", "", as.character(datos$Miles)))

datos$hora <- strptime(datos$hora, format = "%H:%M")

ggplot(datos, aes(x = hora, y = Miles)) + geom_line() +
  scale_x_datetime(date_breaks = "15 mins", date_labels = "%H:%M")


Además, en aes no hay que hacer referencia a la tabla. Expresiones como

ggplot(datos, aes(x = datos$hora, y = datos$Miles)) + ...

son innecesariamente redundantes.

Salud,

Carlos J. Gil Bellosta
http://www.datanalytics.com

El 3 de septiembre de 2016, 18:14, Ruben Tobalina Ramirez <
lagrimaescrita en gmail.com> escribió:
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20160903/64d5d17d/attachment-0001.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 16429 bytes
Desc: no disponible
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20160903/64d5d17d/attachment-0001.png>
#
Muchas gracias a todos!

Pues si, Eric, R a veces me vuelve loco, tiene una lógica muy particular.
Miraré el libro, que lattice no lo he usado nunca.

Gracias Carlos, con tu ejemplo creo que he conseguido hacer el grafico que
queria.

Muchas gracias! Os debo una caña un dia de estos - a los madrileños- en las
reuniones de Medialab. Este año os seguireis reuniendo en Medialab?

Un abrazo!
Prueba algo así:

library(ggplot2)

datos <- read.table("Downloads/pec.csv", header = T, sep = ";", dec = ",")
datos$Miles <- as.numeric(gsub("\\.", "", as.character(datos$Miles)))

datos$hora <- strptime(datos$hora, format = "%H:%M")

ggplot(datos, aes(x = hora, y = Miles)) + geom_line() +
  scale_x_datetime(date_breaks = "15 mins", date_labels = "%H:%M")


Además, en aes no hay que hacer referencia a la tabla. Expresiones como

ggplot(datos, aes(x = datos$hora, y = datos$Miles)) + ...

son innecesariamente redundantes.

Salud,

Carlos J. Gil Bellosta
http://www.datanalytics.com

El 3 de septiembre de 2016, 18:14, Ruben Tobalina Ramirez <
lagrimaescrita en gmail.com> escribió:
_______________________________________________
R-help-es mailing list
R-help-es en r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20160903/872cb828/attachment-0001.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 16429 bytes
Desc: no disponible
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20160903/872cb828/attachment-0001.png>
#
Sí, la primera reunión de la temporada será el 8 de este mes.

Un saludo,

Carlos J. Gil Bellosta
http://www.datanalytics.com

El 3 de septiembre de 2016, 23:52, Ruben Tobalina Ramirez <
lagrimaescrita en gmail.com> escribió:
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20160903/f6e190cc/attachment-0001.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 16429 bytes
Desc: no disponible
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20160903/f6e190cc/attachment-0001.png>
2 days later
#
Buenas,

gracias a los que me ayudaron, he conseguido hacer el código más o menos
como queria. Lo pego por aqui por si a alguien le interesa. Me hubiese
gustado hacerlo en dos ejes pero tengo que entregar la practica de la
especialidad en 3 dias y hay muchas cosas que revisar, pero ya que he visto
como se hace lo investigaré.

ft$hora <- strptime(ft$hora, format = "%H:%M", tz="GMT-2")
ft$Miles <- as.numeric(gsub("\\.", "", as.character(ft$Miles)))
ft$Share <- as.numeric(gsub("\\,", ".", as.character(ft$Share)))

ggbar <- ggplot(ft, aes(x = hora, y = frec)) +
  geom_area(fill= "gray") +
  scale_x_datetime(date_breaks = "5 mins", date_labels = "%H:%M") +
  theme(panel.background = element_rect(fill = "white")) +
  scale_y_continuous(limits=c(0,1500)) +
  labs(x = "Minutos", y = "Tweets") + # Etiquetas o títulos de los ejes
  theme(axis.text.x=element_text(angle=90)) # Orientación texto eje x

ggshr <- ggplot(ft, aes(x = hora, y = Share)) + geom_line(color="blue") +
  scale_x_datetime(date_breaks = "5 mins", date_labels = "%H:%M") +
  theme(panel.background = element_rect(fill = "white")) +
  scale_y_continuous(limits=c(0,50)) +
  labs(x = "Minutos", y = "Share (%)") + # Etiquetas o títulos de los ejes
  theme(axis.text.x=element_text(angle=90)) # Orientación texto eje x

library(gridExtra)
grid.arrange(ggbar, ggshr, nrow=2, ncol=1)

Buenas noches!

PD: Se me jodido, o esta punto de hacerlo mi portátil. Alguna sugerencia de
marca "normal" que funcione de base muy bien con Linux??

Rubén.
#
Hola,

Dell es los pocos que yo sepa que ofrecen equipos con Linux instalado como
SO de base:

http://www.dell.com/es/empresas/p/xps-13-9350-laptop-ubuntu/pd?oc=bnx9333

Saludos,
Carlos Ortega
www.qualityexcellence.es

El 6 de septiembre de 2016, 21:33, Ruben Tobalina Ramirez <
lagrimaescrita en gmail.com> escribió:

  
    
#
Buenos días,

la pregunta estaba un poco mal formulada. No buscaba tanto ordenadores con
Linux instalado,

El 6 de septiembre de 2016, 22:50, Carlos Ortega <cof en qualityexcellence.es>
escribió:

  
    
#
Perdón por el email anterior, se me ha escapado el enter.

Como decía, no buscaba ordenadores con linux instalado, que en realidad me
da igual porque lo instalo yo a mi gusto, sino que tuviesen hardware
adecuado. Por ejemplo, he comprobado que las tarjetas nvidia que aunque lo
nieguen no suelen ir del todo bien y además no la necesito. Y sobretodo, mi
pregunta iba por recomendación de marcas, que mi economia es escasa y
cuando me compro un pc pretendo alargar su uso lo máximo posible.

Bueno, gracias y perdón por la intromisión en el foro de una pregunta no
acorde!

rubén

El 7 de septiembre de 2016, 10:33, Ruben Tobalina Ramirez <
lagrimaescrita en gmail.com> escribió: