ggplot2 geom_bar() argumento fill não retorna legendau

Salve salve irmãos de R, Estou batendo a cabeça pra acertar um gráfico de barras. Eu gostaria que houvesse um grupo de 6 barras (categorias) por visita, ou seja, em cada janela de visita houvesse 6 barras. Cada barra de uma cor pra poder fazer a legenda correspondente. E as barras precisariam corresponder com as frequências das categorias nas visitas. Acho que o problema é que há algumas categorias que são zero, mas elas deveriam aparecer no gráfico e na legenda mesmo assim. Mas quando eu consigo fazer as frequências, as cores ficam ruins e quando eu consigo aproximar as cores as frequências vão embora. O mais próximo que consegui foi assim: #Simulando o banco tab <- array(c(0,0,0,1,34,46,0,0,0,2,24,19,0,0,1,7,6,2), c(6,3)) dimnames(tab) <- list(c("Não informado","Definitivamente insatisfeito","Insatisfeito","Nem satisfeito, nem insatisfeito","Satisfeito","Definitivamente satisfeito"), c("Visita 2", "Visita 3", "Visita 4")) names(dimnames(tab)) <- c("Classificacao", "Visitas") tab df <- epitools::expand.table(tab) df levels(df$Classificacao) prop.table(table(df$Classificacao, df$Visitas),2) # O grafico ramp <- colorRampPalette(c("red","green")) library(tidyverse) ggplot(df, aes(x = Classificacao)) + facet_grid(cols = vars(Visitas)) + geom_bar(aes(y = after_stat(prop), fill = Classificacao, group = 1)) + scale_y_continuous(labels = scales::percent) + labs(y = "Percentual da satisfação", x = "", fill = "Satisfação") + # scale_x_discrete(drop = FALSE) + scale_fill_discrete(drop = FALSE) + scale_fill_manual(values = ramp(length(levels(df$Classificacao)))) # Abraço forte e que a força esteja sempre com voces. Pedro Brasil

Turminha, Só pra ficar mais fácil de entender, se fosse no graphics, ficaria mais ou menos assim: barplot(prop.table(tab,2), ylim = c(0,1), beside = T, legend.text = c("Não informado","Definitivamente insatisfeito","Insatisfeito","Nem satisfeito, nem insatisfeito","Satisfeito","Definitivamente satisfeito"), col = ramp(6), args.legend = list(fill = ramp(6), x = "top", bty = "n", inset = -.15, xpd = NA, ncol = 2)) Pedro Brasil Em ter., 21 de mai. de 2024 às 17:06, Pedro Emmanuel Alvarenga Americano do Brasil <emmanuel.brasil@gmail.com> escreveu:
Salve salve irmãos de R,
Estou batendo a cabeça pra acertar um gráfico de barras. Eu gostaria que houvesse um grupo de 6 barras (categorias) por visita, ou seja, em cada janela de visita houvesse 6 barras. Cada barra de uma cor pra poder fazer a legenda correspondente. E as barras precisariam corresponder com as frequências das categorias nas visitas. Acho que o problema é que há algumas categorias que são zero, mas elas deveriam aparecer no gráfico e na legenda mesmo assim. Mas quando eu consigo fazer as frequências, as cores ficam ruins e quando eu consigo aproximar as cores as frequências vão embora. O mais próximo que consegui foi assim:
#Simulando o banco tab <- array(c(0,0,0,1,34,46,0,0,0,2,24,19,0,0,1,7,6,2), c(6,3)) dimnames(tab) <- list(c("Não informado","Definitivamente insatisfeito","Insatisfeito","Nem satisfeito, nem insatisfeito","Satisfeito","Definitivamente satisfeito"), c("Visita 2", "Visita 3", "Visita 4")) names(dimnames(tab)) <- c("Classificacao", "Visitas") tab df <- epitools::expand.table(tab) df levels(df$Classificacao) prop.table(table(df$Classificacao, df$Visitas),2)
# O grafico ramp <- colorRampPalette(c("red","green"))
library(tidyverse) ggplot(df, aes(x = Classificacao)) + facet_grid(cols = vars(Visitas)) + geom_bar(aes(y = after_stat(prop), fill = Classificacao, group = 1)) + scale_y_continuous(labels = scales::percent) + labs(y = "Percentual da satisfação", x = "", fill = "Satisfação") + # scale_x_discrete(drop = FALSE) + scale_fill_discrete(drop = FALSE) + scale_fill_manual(values = ramp(length(levels(df$Classificacao)))) #
Abraço forte e que a força esteja sempre com voces.
Pedro Brasil

dados_prop <- df %>% group_by(Visitas, Classificacao) %>% summarise(count = n()) %>% mutate(prop = count / sum(count)) %>% as.data.frame() %>% droplevels() ggplot(dados_prop, aes(x = Visitas, y = prop, fill = Classificacao)) + geom_bar(stat = "identity", position = "stack") + scale_fill_manual(values = ramp(4)) + labs(x = "Visitas", y = "Proporção", fill = "Classificação") + scale_y_continuous(labels = scales::percent, limits = c(0,1)) + theme_minimal() ggplot(dados_prop, aes(x = Visitas, y = prop, fill = Classificacao)) + geom_bar(stat = "identity", position = "dodge") + scale_fill_manual(values = ramp(4)) + labs(x = "", y = "Proporção", fill = "Classificação") + scale_y_continuous(labels = scales::percent, limits = c(0,1)) + theme_classic()+ theme(legend.position = "top") *Cid Edson Mendonça Póvoas* *Engenheiro Agrônomo - **Data Scientist* *CREA-BA: 051984991-4* *Técnico em Segurança do Trabalho * *Nº: **0012669/BA* *Tel: +55 73 99151-9565* *Lattes : *http://lattes.cnpq.br/2303498368142537 *LinkedIn :* http://br.linkedin.com/in/cidedson/ *Whatsapp :* https://wa.me/5573991519565 Em ter., 21 de mai. de 2024 às 17:37, Pedro Emmanuel Alvarenga Americano do Brasil por (R-br) <r-br@listas.c3sl.ufpr.br> escreveu:
Turminha,
Só pra ficar mais fácil de entender, se fosse no graphics, ficaria mais ou menos assim: barplot(prop.table(tab,2), ylim = c(0,1), beside = T, legend.text = c("Não informado","Definitivamente insatisfeito","Insatisfeito","Nem satisfeito, nem insatisfeito","Satisfeito","Definitivamente satisfeito"), col = ramp(6), args.legend = list(fill = ramp(6), x = "top", bty = "n", inset = -.15, xpd = NA, ncol = 2))
Pedro Brasil
Em ter., 21 de mai. de 2024 às 17:06, Pedro Emmanuel Alvarenga Americano do Brasil <emmanuel.brasil@gmail.com> escreveu:
Salve salve irmãos de R,
Estou batendo a cabeça pra acertar um gráfico de barras. Eu gostaria que houvesse um grupo de 6 barras (categorias) por visita, ou seja, em cada janela de visita houvesse 6 barras. Cada barra de uma cor pra poder fazer a legenda correspondente. E as barras precisariam corresponder com as frequências das categorias nas visitas. Acho que o problema é que há algumas categorias que são zero, mas elas deveriam aparecer no gráfico e na legenda mesmo assim. Mas quando eu consigo fazer as frequências, as cores ficam ruins e quando eu consigo aproximar as cores as frequências vão embora. O mais próximo que consegui foi assim:
#Simulando o banco tab <- array(c(0,0,0,1,34,46,0,0,0,2,24,19,0,0,1,7,6,2), c(6,3)) dimnames(tab) <- list(c("Não informado","Definitivamente insatisfeito","Insatisfeito","Nem satisfeito, nem insatisfeito","Satisfeito","Definitivamente satisfeito"), c("Visita 2", "Visita 3", "Visita 4")) names(dimnames(tab)) <- c("Classificacao", "Visitas") tab df <- epitools::expand.table(tab) df levels(df$Classificacao) prop.table(table(df$Classificacao, df$Visitas),2)
# O grafico ramp <- colorRampPalette(c("red","green"))
library(tidyverse) ggplot(df, aes(x = Classificacao)) + facet_grid(cols = vars(Visitas)) + geom_bar(aes(y = after_stat(prop), fill = Classificacao, group = 1)) + scale_y_continuous(labels = scales::percent) + labs(y = "Percentual da satisfação", x = "", fill = "Satisfação") + # scale_x_discrete(drop = FALSE) + scale_fill_discrete(drop = FALSE) + scale_fill_manual(values = ramp(length(levels(df$Classificacao)))) #
Abraço forte e que a força esteja sempre com voces.
Pedro Brasil
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Acredito que assim fica melhor dados_prop <- df %>% count(Visitas, Classificacao) %>% complete(Visitas, Classificacao, fill = list(n = 0)) %>% group_by(Visitas) %>% mutate(prop = n / sum(n)) ggplot(dados_prop, aes(x = Visitas, y = prop, fill = Classificacao)) + geom_bar(stat = "identity", position = position_dodge(), color="black") + scale_y_continuous(limits = c(0, 1), labels = scales::percent_format()) + labs( x = "", y = "Proporção", fill = "Classificação" ) + scale_fill_manual( values = ramp(6), labels = c("Não informado", "Definitivamente insatisfeito", "Insatisfeito", "Nem satisfeito, nem insatisfeito", "Satisfeito", "Definitivamente satisfeito") ) + theme_classic() + theme(legend.position = "top") *Cid Edson Mendonça Póvoas* *Engenheiro Agrônomo - **Data Scientist* *CREA-BA: 051984991-4* *Técnico em Segurança do Trabalho * *Nº: **0012669/BA* *Tel: +55 73 99151-9565* *Lattes : *http://lattes.cnpq.br/2303498368142537 *LinkedIn :* http://br.linkedin.com/in/cidedson/ *Whatsapp :* https://wa.me/5573991519565 Em ter., 21 de mai. de 2024 às 17:37, Pedro Emmanuel Alvarenga Americano do Brasil por (R-br) <r-br@listas.c3sl.ufpr.br> escreveu:
Turminha,
Só pra ficar mais fácil de entender, se fosse no graphics, ficaria mais ou menos assim: barplot(prop.table(tab,2), ylim = c(0,1), beside = T, legend.text = c("Não informado","Definitivamente insatisfeito","Insatisfeito","Nem satisfeito, nem insatisfeito","Satisfeito","Definitivamente satisfeito"), col = ramp(6), args.legend = list(fill = ramp(6), x = "top", bty = "n", inset = -.15, xpd = NA, ncol = 2))
Pedro Brasil
Em ter., 21 de mai. de 2024 às 17:06, Pedro Emmanuel Alvarenga Americano do Brasil <emmanuel.brasil@gmail.com> escreveu:
Salve salve irmãos de R,
Estou batendo a cabeça pra acertar um gráfico de barras. Eu gostaria que houvesse um grupo de 6 barras (categorias) por visita, ou seja, em cada janela de visita houvesse 6 barras. Cada barra de uma cor pra poder fazer a legenda correspondente. E as barras precisariam corresponder com as frequências das categorias nas visitas. Acho que o problema é que há algumas categorias que são zero, mas elas deveriam aparecer no gráfico e na legenda mesmo assim. Mas quando eu consigo fazer as frequências, as cores ficam ruins e quando eu consigo aproximar as cores as frequências vão embora. O mais próximo que consegui foi assim:
#Simulando o banco tab <- array(c(0,0,0,1,34,46,0,0,0,2,24,19,0,0,1,7,6,2), c(6,3)) dimnames(tab) <- list(c("Não informado","Definitivamente insatisfeito","Insatisfeito","Nem satisfeito, nem insatisfeito","Satisfeito","Definitivamente satisfeito"), c("Visita 2", "Visita 3", "Visita 4")) names(dimnames(tab)) <- c("Classificacao", "Visitas") tab df <- epitools::expand.table(tab) df levels(df$Classificacao) prop.table(table(df$Classificacao, df$Visitas),2)
# O grafico ramp <- colorRampPalette(c("red","green"))
library(tidyverse) ggplot(df, aes(x = Classificacao)) + facet_grid(cols = vars(Visitas)) + geom_bar(aes(y = after_stat(prop), fill = Classificacao, group = 1)) + scale_y_continuous(labels = scales::percent) + labs(y = "Percentual da satisfação", x = "", fill = "Satisfação") + # scale_x_discrete(drop = FALSE) + scale_fill_discrete(drop = FALSE) + scale_fill_manual(values = ramp(length(levels(df$Classificacao)))) #
Abraço forte e que a força esteja sempre com voces.
Pedro Brasil
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Salve Turminha, Valeu pela ajuda. Entendi que a questão não era exatamente no grafico mas nos dados que estavam entrando no grafico. Depois de olhar o primeiro codigo do CID, eu cheguei a quase a mesma solução, sendo a diferença na definição dos dados, assim: # o .drop = FALSE fez a diferença porque manteve as categorias com contagem zero dados_prop <- df %>% group_by(Visitas, Classificacao, .drop = FALSE) %>% summarise(count = n()) %>% mutate(prop = count / sum(count)) ggplot(dados_prop, aes(x = Visitas, y = prop, fill = Classificacao)) + geom_bar(stat = "identity", position = "dodge") + scale_fill_manual(values = ramp(6)) + labs(x = "", y = "Proporção", fill = "Classificação") + scale_y_continuous(labels = scales::percent, limits = c(0,1)) + theme_classic()+ theme(legend.position = "top") Valeu valeu... que aforça esteja sempre com voces. Pedro Brasil Em qua., 22 de mai. de 2024 às 08:33, Cid Póvoas <cidedson@gmail.com> escreveu:
Acredito que assim fica melhor
dados_prop <- df %>% count(Visitas, Classificacao) %>% complete(Visitas, Classificacao, fill = list(n = 0)) %>% group_by(Visitas) %>% mutate(prop = n / sum(n))
ggplot(dados_prop, aes(x = Visitas, y = prop, fill = Classificacao)) + geom_bar(stat = "identity", position = position_dodge(), color="black") + scale_y_continuous(limits = c(0, 1), labels = scales::percent_format()) + labs( x = "", y = "Proporção", fill = "Classificação" ) + scale_fill_manual( values = ramp(6), labels = c("Não informado", "Definitivamente insatisfeito", "Insatisfeito", "Nem satisfeito, nem insatisfeito", "Satisfeito", "Definitivamente satisfeito") ) + theme_classic() + theme(legend.position = "top")
*Cid Edson Mendonça Póvoas*
*Engenheiro Agrônomo - **Data Scientist* *CREA-BA: 051984991-4* *Técnico em Segurança do Trabalho * *Nº: **0012669/BA* *Tel: +55 73 99151-9565* *Lattes : *http://lattes.cnpq.br/2303498368142537 *LinkedIn :* http://br.linkedin.com/in/cidedson/ *Whatsapp :* https://wa.me/5573991519565
Em ter., 21 de mai. de 2024 às 17:37, Pedro Emmanuel Alvarenga Americano do Brasil por (R-br) <r-br@listas.c3sl.ufpr.br> escreveu:
Turminha,
Só pra ficar mais fácil de entender, se fosse no graphics, ficaria mais ou menos assim: barplot(prop.table(tab,2), ylim = c(0,1), beside = T, legend.text = c("Não informado","Definitivamente insatisfeito","Insatisfeito","Nem satisfeito, nem insatisfeito","Satisfeito","Definitivamente satisfeito"), col = ramp(6), args.legend = list(fill = ramp(6), x = "top", bty = "n", inset = -.15, xpd = NA, ncol = 2))
Pedro Brasil
Em ter., 21 de mai. de 2024 às 17:06, Pedro Emmanuel Alvarenga Americano do Brasil <emmanuel.brasil@gmail.com> escreveu:
Salve salve irmãos de R,
Estou batendo a cabeça pra acertar um gráfico de barras. Eu gostaria que houvesse um grupo de 6 barras (categorias) por visita, ou seja, em cada janela de visita houvesse 6 barras. Cada barra de uma cor pra poder fazer a legenda correspondente. E as barras precisariam corresponder com as frequências das categorias nas visitas. Acho que o problema é que há algumas categorias que são zero, mas elas deveriam aparecer no gráfico e na legenda mesmo assim. Mas quando eu consigo fazer as frequências, as cores ficam ruins e quando eu consigo aproximar as cores as frequências vão embora. O mais próximo que consegui foi assim:
#Simulando o banco tab <- array(c(0,0,0,1,34,46,0,0,0,2,24,19,0,0,1,7,6,2), c(6,3)) dimnames(tab) <- list(c("Não informado","Definitivamente insatisfeito","Insatisfeito","Nem satisfeito, nem insatisfeito","Satisfeito","Definitivamente satisfeito"), c("Visita 2", "Visita 3", "Visita 4")) names(dimnames(tab)) <- c("Classificacao", "Visitas") tab df <- epitools::expand.table(tab) df levels(df$Classificacao) prop.table(table(df$Classificacao, df$Visitas),2)
# O grafico ramp <- colorRampPalette(c("red","green"))
library(tidyverse) ggplot(df, aes(x = Classificacao)) + facet_grid(cols = vars(Visitas)) + geom_bar(aes(y = after_stat(prop), fill = Classificacao, group = 1)) + scale_y_continuous(labels = scales::percent) + labs(y = "Percentual da satisfação", x = "", fill = "Satisfação") + # scale_x_discrete(drop = FALSE) + scale_fill_discrete(drop = FALSE) + scale_fill_manual(values = ramp(length(levels(df$Classificacao)))) #
Abraço forte e que a força esteja sempre com voces.
Pedro Brasil
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
participantes (2)
-
Cid Póvoas
-
Pedro Emmanuel Alvarenga Americano do Brasil