Indrodução

A construção de gráficos no R foi revolucionada com a criação do pacote ggplot2, fruto da tese de doutorado de Hadley Wickham. Essa revolução teve base na filosofia adotada por Hadley ao definir o que deveria ser um gráfico estatístico.

Em 2005, Leland publicou o livro The Grammar of graphics, uma fonte de princípios fundamentais para a construção de gráficos estatísticos. No livro, ele defende que um gráfico é o mapeamento dos dados a partir de atributos estéticos (posição, cor, forma, tamanho) de objetos geométricos (pontos, linhas, barras, caixas).

Livro The Grammar of graphics

Livro “The Grammar of graphics”

No R há vários dispositivos para fazer gráficos, porém o ggplot2 é um dos mais elegantes e versáteis. Este implementa a gramática, um sistema coerente para descrever e construir gráficos.

Livro ggplot2

Livro “ggplot2”

O ggplot2 traz outras vantagens em relação aos gráficos do R base:

Camadas de um gráfico

No ggplot2, os gráficos são construídos camada por camada (ou, layers, em inglês), sendo a primeira delas dada pela função ggplot() . Essa função recebe um data frame e cria a camada base do gráfico. Se rodarmos apenas a função ggplot(), obteremos um painel em branco.

library(ggplot2)
head(mtcars)
ggplot(data = mtcars)

ggplot(data = mtcars) + 
  geom_point(mapping = aes(x = disp, y = mpg))

ggplot(data = mtcars) + 
  geom_point(mapping = aes(x = disp, y = mpg)) +
  labs(x = "Cilindradas", y = "Milhas/galão")

Cores

am1<-factor(mtcars$am,labels = c("automatic","manual"))

ggplot(data = mtcars) + 
  geom_point(mapping = aes(x = disp, y = mpg, color = am1))

####

ggplot(mtcars, aes(disp,mpg)) + geom_point(aes(colour = "red"))

ggplot(mtcars, aes(disp,mpg)) + geom_point(colour = "blue")

ggplot(mtcars) + 
  geom_point(mapping = aes(x = disp, y = mpg, colour = carb))

Tamanho

ggplot(mtcars) + 
  geom_point(mapping = aes(x = disp, y = mpg, colour = carb,size = wt))

ggplot(mtcars) + 
  geom_point(mapping = aes(x = disp, y = mpg, colour = carb,size = wt),alpha = 1,shape = 6)

Smoother

ggplot(mtcars, aes(disp, mpg)) +
geom_point(size = 4,color = "lightblue") +
geom_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

ggplot(mtcars, aes(disp, mpg)) +
geom_point(size = 4,color = "lightblue") +
geom_smooth(method = "lm")

Geoms

Os geoms definem qual forma geométrica será utilizada para a visualização das observações. Por exemplo, a função geom_point() gera gráficos de dispersão transformando pares (x,y) em pontos. Veja a seguir outros geoms bastante utilizados:

ggplot(mtcars, aes(x=as.factor(am),y = mpg)) +
  geom_boxplot()

ggplot(mtcars) + 
  geom_histogram(aes(x = mpg))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(mtcars, aes(carb)) +
geom_bar()

### outros tipos

ggplot(mtcars, aes(x=as.factor(am),y = mpg)) +
  geom_violin()

# O gráfico de violino é a combinação do boxplot e a linha de densidade no mesmo diagrama, permitindo visualizar detalhes que as duas técnicas sozinhas não seriam capaz de detectar [Hintze and Nelson 1998]. 

ggplot(mtcars) + 
  geom_freqpoly(aes(x = mpg))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Facets

O facet permite a visualização de diferentes subconjuntos de dados em gráficos separados, permitindo a mostrar comportamentos diferentes entre os grupos analisados.

ggplot(mtcars, aes(y = mpg, x = disp)) + 
  geom_point() +
  geom_smooth(method = "lm") + 
facet_grid(~am)

Personanlizando os gráficos

‘O maior valor de uma imagem é quando ela nos força a notar o que nunca esperávamos ver - John Tukey’

head(PlantGrowth)
bp <- ggplot(data = PlantGrowth, aes(x = group, y = weight)) + geom_boxplot()
bp

bp1 <- ggplot(data = PlantGrowth, aes(x = group, y = weight, fill=group)) + geom_boxplot()
bp1

# retirando a legenda

bp2 <- ggplot(data = PlantGrowth, aes(x = group, y = weight, fill=group)) + geom_boxplot()
bp2 + guides(fill = FALSE) 

# ou da forma bp2 + theme(legend.position="none") 

bp3 <- ggplot(data = PlantGrowth, aes(x = group, y = weight, fill=group)) + geom_boxplot()
bp3 + theme(legend.position="none")

# removendo o nome da legenda

bp4 <- ggplot(data = PlantGrowth, aes(x = group, y = weight, fill=group)) + geom_boxplot()
bp4 + guides(fill=guide_legend(title=NULL))

# Remove o título de todas as legendas "+ theme(legend.title = element_blank())"

Modificando texto, cores e rótulos

bp5 <- ggplot(data = PlantGrowth, aes(x = group, y = weight, fill=group)) + geom_boxplot()
bp5 + scale_fill_discrete(name = "Tratamentos",
                         breaks = c("ctrl", "trt1", "trt2"),
                         labels = c("Controle", "Tratamento 1", "Tratamento 2"))

Uma das formas de encontrar uma paleta de cores no R e fazer de forma automática é via o pacote RColorBrewer. Ao executar a função display.brewer.all() você irá observar diferentes paletas de cores que você pode utilizar. Outra opção, é utilizar o site deles colorbrewer2(http://colorbrewer2.org/#type=diverging&scheme=RdYlGn&n=11).

library(RColorBrewer)


bp5 + scale_fill_discrete(name = "Tratamentos",
                         breaks = c("ctrl", "trt1", "trt2"),
                         labels = c("Controle", "Tratamento 1", "Tratamento 2"))                         

# mudando as cores 

bp5 + scale_fill_brewer(palette = "RdYlGn", direction = 1)

# ou da forma

bp5 + scale_fill_manual(values=c("#b83535", "#4c618a", "#512a6e"), 
                       name="Tratamentos",
                       breaks=c("ctrl", "trt1", "trt2"),
                       labels=c("Controle", "Tratamento 1", "Tratamento 2"))

Existem inúmeras modificações que podem ser realizadas na aparência da legenda. Todas elas estão relacionadas à modificação do element_text().

bp5 + scale_fill_manual(values=c("#b83535", "#4c618a", "#512a6e"), 
                       name="Tratamentos",breaks=c("ctrl", "trt1", "trt2"),
                       labels=c("Controle", "Tratamento 1", "Tratamento 2")) +
   theme(legend.title = element_text(color = "blue", size = 16, face = "bold"))

###

bp5 + scale_fill_manual(values=c("#b83535", "#4c618a", "#512a6e"), 
                       name="Tratamentos",breaks=c("ctrl", "trt1", "trt2"),
                       labels=c("Controle", "Tratamento 1", "Tratamento 2")) +
   theme(legend.title = element_text(color = "blue", size = 16, face = "bold"),legend.position="top")

bp5 + labs(x="Tratamentos",y="Peso") + labs(title="Crescimento do cultivar")

g<-bp5 + labs(x="Tratamentos",y="Peso") + labs(title="Crescimento do cultivar")
ggsave(filename = "meugrafico.png", plot = g)
## Saving 7 x 5 in image
library(devtools)
## Loading required package: usethis
install_github("thomasp85/patchwork")
## Skipping install of 'patchwork' from a github remote, the SHA1 (36b49187) has not changed since last install.
##   Use `force = TRUE` to force installation
library(patchwork)

p<-ggplot(PlantGrowth, aes(weight,fill=group)) + geom_histogram()
s<-ggplot(PlantGrowth, aes(weight, colour = group)) + geom_freqpoly()

(g | p) / s
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Mais informações em : https://gotellilab.github.io/GotelliLabMeetingHacks/NickGotelli/ggplotPatchwork.html.

Uma forma de incrementar um boxplot é plotar também todos os pontos, e não apenas os cinco que o boxplot representa. Isso pode ser feito com a função geom_jitter().

g + geom_jitter(color = "red")

Temas

Um característica do ggplot2 é o seu conjunto de temas pré-definidos.

g + theme_dark()

g + theme_replace()

library(cowplot)
## 
## ********************************************************
## Note: As of version 1.0.0, cowplot does not change the
##   default ggplot2 theme anymore. To recover the previous
##   behavior, execute:
##   theme_set(theme_cowplot())
## ********************************************************
g + theme_set(theme_cowplot(12))

g + theme_nothing()

Gráficos de barras

library(MASS)
head(Cars93)
ggplot(Cars93,aes(x=Type)) + 
  geom_bar() + 
  labs(y="Frequência", title = "Tipo do carro")

##  gráfico de barras agrupadas

type1<-subset(Cars93,select=c("Type","Origin"))
head(type1)
ggplot(type1,aes(x=Type,fill = Origin)) +
geom_bar(position = "dodge",color = "lightblue")

Gráfico com alguma “condição”

Vamos utilizar o dataset “airquality” para construirmos um gráfico com uma condição. Por exemplo, se um nível de ozônio para um dia específico for menor ou igual ao nível médio, consideraremos “Baixo”, do contrário “Alto”.

library(tidyr)

aq.no.NA<-drop_na(airquality)
med<-mean(aq.no.NA$Ozone)
ozone_level<-NULL

for (i in 1:nrow(aq.no.NA)){
if (aq.no.NA$Ozone[i]<=med){
ozone_level[i]<-'Baixo'}
else {ozone_level[i]<-'Alto'}
}

aq.ozone_level<-cbind(aq.no.NA,ozone_level)
head(aq.ozone_level)
ggplot(aq.ozone_level,aes(x=Wind,y=Temp,color = ozone_level)) + geom_point(size = 4) + theme_bw()

Gráfico erro padrão média

library(car)
## Loading required package: carData
library(Rmisc)
## Loading required package: lattice
## Loading required package: plyr
head(Salaries)
df<-summarySE(Salaries,measurevar=c('salary'),groupvars=c('rank','sex')) # que outra maneira poderíamos fazer isso?
head(df)
# Gráfico

ep<-ggplot(df,aes(x=rank,y=salary,fill=sex))

ep1<-ep + geom_bar(stat="identity",position ="dodge") + geom_errorbar(aes(ymin = salary-se, ymax = salary + se), position = "dodge", width = 0.3)

ep1

Gráfico tridimensional

library(scatterplot3d)

with(aq.ozone_level,scatterplot3d(Wind ~Temp + Ozone, pch = 18))

library(plotly)
## 
## Attaching package: 'plotly'
## The following objects are masked from 'package:plyr':
## 
##     arrange, mutate, rename, summarise
## The following object is masked from 'package:MASS':
## 
##     select
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
plot_ly(aq.ozone_level, x = ~Temp, y = ~Ozone, z = ~Wind) %>%
  add_markers(color = ~Temp)

Matriz do gráfico de dispersão

Uma matriz de gráficos de dispersão mostra as relações de pares entre mais de duas variáveis.

library(GGally)
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
aq_subset<-subset(aq.no.NA, select = c(Ozone, Wind, Temp, Solar.R))
ggpairs(aq_subset)

Correlação

É muito comum que tenhamos um conjunto de dados com muitas variáveis e queiramos saber a relação entres estas variáveis, por exemplo, quais são mais ou menos correlacionadas entre si (positiva ou negativamente) ou se as correlações são parecidas entre si (matriz de correlação estruturada) ou todas bem diferentes (matriz não estruturada).

library(GGally)
ggpairs(iris, lower = list(continuous = "smooth"))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

# ou da forma:

ggpairs(iris, columns = 1:4, ggplot2::aes(colour=Species))

p <- ggpairs(iris, aes(color = Species))+ theme_bw()
for(i in 1:p$nrow) {
  for(j in 1:p$ncol){
    p[i,j] <- p[i,j] + 
        scale_fill_manual(values=c("#00AFBB", "#E7B800", "#FC4E07")) +
        scale_color_manual(values=c("#00AFBB", "#E7B800", "#FC4E07"))  
  }
}
p
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Outra maneira de apresentar as relações (nesse caso, as correlações) entre as variáveis quantitativas é usando gráficos que se assemelham aos gráficos de “calor” (heatmaps), no qual as cores de cada correlação vão indicar a força e o sinal da correlação.

head(swiss)
ggcorr(swiss, label=T)

knitr::kable(cor(swiss))
Fertility Agriculture Examination Education Catholic Infant.Mortality
Fertility 1.0000000 0.3530792 -0.6458827 -0.6637889 0.4636847 0.4165560
Agriculture 0.3530792 1.0000000 -0.6865422 -0.6395225 0.4010951 -0.0608586
Examination -0.6458827 -0.6865422 1.0000000 0.6984153 -0.5727418 -0.1140216
Education -0.6637889 -0.6395225 0.6984153 1.0000000 -0.1538589 -0.0993218
Catholic 0.4636847 0.4010951 -0.5727418 -0.1538589 1.0000000 0.1754959
Infant.Mortality 0.4165560 -0.0608586 -0.1140216 -0.0993218 0.1754959 1.0000000
# outra forma

library(corrplot)
## corrplot 0.84 loaded
M <- cor(swiss)
corrplot(M)

# Podemos utilizar o método de agrupamento hierárquico por meio da função 'hclust'

corrplot(M, order = "hclust", addrect = 3, tl.pos="d")

# por último

library(corrgram)
## Registered S3 method overwritten by 'seriation':
##   method         from 
##   reorder.hclust gclus
## 
## Attaching package: 'corrgram'
## The following object is masked from 'package:plyr':
## 
##     baseball
## The following object is masked from 'package:lattice':
## 
##     panel.fill
corrgram(swiss, lower.panel = panel.pts, upper.panel= panel.conf, diag.panel = panel.density)

Gráfico de densidade

Ao trabalhar com uma variável contínua pedemos dividir os dados em intervalos e fazer um histograma e calcular a densidade de kernel estimada para a distribuição da variável.

ggplot(aq.no.NA,aes(x = Wind)) +
  geom_density()

ggplot(aq.no.NA,aes(x = Temp)) +
  geom_density(color = "lightblue")

Gráfico de séries temporais

dados <- ts(matrix(rnorm(300), 100, 3), start=c(1961, 1), 
              frequency=12)

dados[1:4,]
##        Series 1   Series 2    Series 3
## [1,] -1.5228361  0.4991462  0.07349756
## [2,] -0.3458876 -1.0889726 -0.97966218
## [3,]  0.2574385  0.9616205  0.18518546
## [4,]  0.8776312 -1.2920549  0.01267323
plot(ts(dados))

# no pacote lattice

library(lattice)
xyplot(dados)

xyplot(dados, superpose = TRUE)

# ggplot2

datas <- seq(as.Date(paste(c(start(dados),1), collapse="/")), 
             by = "month", length.out = length(dados))
dados.df <- data.frame(date = datas, value = dados)
ggplot(data=dados.df) + geom_line(aes(date, value.Series.1))

## colocar as séries em um único gráfico

tmp <- stack(dados.df, select = -1)
tmp$date <- dados.df[,1]

ggplot(data=dados.df) + geom_line(aes(date, value.Series.1))

library(fpp)
## Loading required package: forecast
## Registered S3 method overwritten by 'xts':
##   method     from
##   as.zoo.xts zoo
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## Registered S3 methods overwritten by 'forecast':
##   method             from    
##   fitted.fracdiff    fracdiff
##   residuals.fracdiff fracdiff
## Loading required package: fma
## 
## Attaching package: 'fma'
## The following object is masked from 'package:corrgram':
## 
##     auto
## The following object is masked from 'package:GGally':
## 
##     pigs
## The following object is masked from 'package:plyr':
## 
##     ozone
## The following objects are masked from 'package:MASS':
## 
##     cement, housing, petrol
## Loading required package: expsmooth
## Loading required package: lmtest
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: tseries
autoplot(a10) +
ggtitle("Gráfico para Vendas de antibióticos na Austrália") +
ylab("$ milhões") + xlab("Ano")

# gráfico de sazonalidade

ggseasonplot(a10, year.labels=TRUE, year.labels.left=TRUE) +
 ylab("$ milhões") + xlab("Mês")+ ggtitle("Gráfico GGSeasonplot para Vendas de antibióticos na Austrália")

Gráfico polar

Um gráfico polar exibe uma série como um conjunto de pontos agrupados por categoria em um círculo de 360 graus. Os valores são representados pelo comprimento do ponto, conforme medido do centro do círculo. Quanto mais distante o ponto está do centro, maior é o seu valor.

Um gráfico de radar exibe uma série como uma linha ou área circular. Ao contrário do gráfico polar, o gráfico de radar não exibe dados em termos de coordenadas polares.

ggseasonplot(a10, polar=TRUE) +
 ylab("$ milhoes") + xlab("Mes") + ggtitle("Graf. Polar")

Por fim, podemos comparar as diferentes estações por mês. No gráfico abaixo, temos as séries divididas pelos meses com o traço azul indicando a média de cada um.

ggsubseriesplot(a10) + ylab("$ milhões") + xlab("Mês")+
 ggtitle("Graf. GGSubseriesplot")

Gráfico de setores

library(tidyverse)
## -- Attaching packages ------------------------------------------- tidyverse 1.2.1 --
## v tibble  2.1.3     v dplyr   0.8.3
## v readr   1.3.1     v stringr 1.4.0
## v purrr   0.3.2     v forcats 0.4.0
## -- Conflicts ---------------------------------------------- tidyverse_conflicts() --
## x dplyr::arrange()   masks plotly::arrange(), plyr::arrange()
## x purrr::compact()   masks plyr::compact()
## x dplyr::count()     masks plyr::count()
## x dplyr::failwith()  masks plyr::failwith()
## x dplyr::filter()    masks plotly::filter(), stats::filter()
## x dplyr::id()        masks plyr::id()
## x dplyr::lag()       masks stats::lag()
## x dplyr::mutate()    masks plotly::mutate(), plyr::mutate()
## x dplyr::recode()    masks car::recode()
## x dplyr::rename()    masks plotly::rename(), plyr::rename()
## x dplyr::select()    masks plotly::select(), MASS::select()
## x purrr::some()      masks car::some()
## x dplyr::summarise() masks plotly::summarise(), plyr::summarise()
## x dplyr::summarize() masks plyr::summarize()
url <- "http://www.leg.ufpr.br/~walmes/data/duster_venda_260314.txt"
dus <- read.table(file = url,
                  header = TRUE,sep = "\t",
                  encoding = "utf-8")
glimpse(dus)
## Observations: 699
## Variables: 10
## $ modelo <fct> RENAULT DUSTER 1.6 EXPRESSION 4X2 16V FLEX 4P MANUAL, R...
## $ cor    <fct> Prata, Azul, Prata, Prata, Prata, Vermelho, Preto, Pret...
## $ km     <int> 31442, 40800, 56000, NA, 45000, 50000, 44000, 30000, 41...
## $ ano    <fct> 2011/2012, 2011/2012, 2011/2012, 2011/2012, 2011/2012, ...
## $ valor  <dbl> 41990, 42500, 42900, 42990, 43800, 43999, 44900, 45000,...
## $ cambio <fct> MANUAL, MANUAL, MANUAL, MANUAL, MANUAL, MANUAL, MANUAL,...
## $ poten  <dbl> 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 2.0, 1.6, 1.6, ...
## $ trac   <fct> 4X2, 4X2, 4X2, 4X2, 4X2, 4X2, 4X2, 4X2, 4X2, 4X2, 4X2, ...
## $ cat    <fct>  EXPRESSION ,  ,  DYNAMIQUE ,  DYNAMIQUE ,  ,  ,  DYNAM...
## $ novo   <fct> usado, usado, usado, usado, usado, usado, usado, usado,...
x <- table(dus$cambio)
class(x)
## [1] "table"
x <- xtabs(~cambio, data = dus)
class(x)
## [1] "xtabs" "table"
barplot(x,xlab = "Tipo de câmbio",
        ylab = "Frequência absoluta",
        col = c("seagreen", "yellow"))

pie(x,col = c("#5398ed",rgb(12, 58, 114, max = 255)),
            main = "Tipo de câmbio")

##

df <- data.frame(group = c("M", "F", "C"),
  value = c(2, 3, 5))
head(df)
bp<- ggplot(df, aes(x="", y=value, fill=group))+
geom_bar(width = 1, stat = "identity")
bp

pie <- bp + coord_polar("y")
pie

pie + scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))

##

library(scales)
## 
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
## 
##     discard
## The following object is masked from 'package:readr':
## 
##     col_factor
pie + scale_fill_brewer("Blues") + 
  theme(axis.text.x=element_blank()) +
  geom_text(aes(y = value/3 + c(0, cumsum(value)[-length(value)]), 
            label = percent(value/100)), size=5)

# como fazer um pie para o exemplo anterior?

Gráfico mosaico

head(HairEyeColor)
## [1] 32 53 10  3 11 50
mosaicplot(HairEyeColor,
           off = 2,
           col = c("blue", "yellowgreen"))

###

dimnames(HairEyeColor)
## $Hair
## [1] "Black" "Brown" "Red"   "Blond"
## 
## $Eye
## [1] "Brown" "Blue"  "Hazel" "Green"
## 
## $Sex
## [1] "Male"   "Female"
Tabela <- apply(HairEyeColor,
           MARGIN = c(1, 2),
           FUN = sum)
print(Tabela)
##        Eye
## Hair    Brown Blue Hazel Green
##   Black    68   20    15     5
##   Brown   119   84    54    29
##   Red      26   17    14    14
##   Blond     7   94    10    16
# Vetor que associa cores conforme os níveis dos fatores às cores usadas para preenchimento

cols <- c(Brown = "#6b2205",
          Blue = "#4fb2ff",
          Green = "#1a9b1e",
          Blond = "#d8d652",
          Red = "#bc1405",
          Black = "#210a08",
          Hazel = "#a86526")

mosaicplot(Tabela, col = cols[colnames(Tabela)])

Gráficos dinâmicos - pacote plotly

library(plotly)
library(ggplot2)

p <- mtcars %>% 
  ggplot(aes(x = disp, y = mpg, colour = as.factor(am))) + 
  geom_point()

ggplotly(p)
library(dplyr)
library(tidyverse)
library(plotly)

head(ToothGrowth)
###  Gráfico de barras erro (pode ser erro padrão da média também)


med<-ToothGrowth %>% group_by(supp,dose) %>% summarize(med=mean(len))
desvio<-ToothGrowth %>% group_by(supp,dose) %>% summarize(desvio=sd(len))

data<-data.frame(med,desvio$desvio)
data<-as_tibble(data)

data1 <- data %>% rename(desvio = desvio.desvio)
data1$dose <- as.factor(data1$dose)

p0 <- plot_ly(data = data1[which(data1$supp == 'OJ'),], x = ~ dose, y = ~ med, type = 'bar', name = 'OJ',
             error_y = ~list(array = desvio,color = '#000000')) %>%
  add_trace(data = data1[which(data1$supp == 'VC'),], name = 'VC')
p0
### Scatterplot

p1 <- plot_ly(data = data1[which(data1$supp == 'OJ'),], x = ~ dose, y = ~ med, type = 'scatter', name = 'OJ', error_y = ~list(array = desvio,color = '#000000')) %>% add_trace(data = data1[which(data1$supp == 'VC'),], name = 'VC')
p1
## No scatter mode specifed:
##   Setting the mode to markers
##   Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
## No scatter mode specifed:
##   Setting the mode to markers
##   Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
### Scatterplot com linha

p2 <- plot_ly(data = data1[which(data1$supp == 'OJ'),], x = ~ dose, y = ~ med, type = 'scatter', name = 'OJ',
    mode = 'lines+markers',error_y = ~list(array = desvio,color = '#000000')) %>%
  add_trace(data = data1[which(data1$supp == 'VC'),], name = 'VC')
p2
## Gráfico de violino

p3 <- ToothGrowth %>%
  plot_ly(y = ~len,type = 'violin',box = list(visible = T),
      meanline = list(visible = T),x0 = 'Tooth length') %>% 
  layout(yaxis = list(title = "",zeroline = F))
p3
#######

p4 <- ToothGrowth %>%
  plot_ly(x = ~supp,y = ~len,split = ~supp,type = 'violin',
  box = list(visible = T),meanline = list(visible = T)) %>% 
  layout(xaxis = list(title = ""),yaxis = list(title = "",zeroline = F))
p4