ipeadata-lab / ipeaplot

ipeaplot: criando graficos no padrão editorial do Ipea
https://ipeadata-lab.github.io/ipeaplot/
Other
1 stars 0 forks source link

Palette in theme_ipea function #3

Closed cavalcanti1985 closed 1 year ago

cavalcanti1985 commented 1 year ago

Is it possible to include the Ipea color palette in the theme_ipea function?

PedroJorge7 commented 1 year ago

I changed the function "theme_ipea" to "ipea_style" and now called a generalist function "ipea_theme" to group all the arguments (ipea_style, scale_ipea, ipea_text).

An reproduce code:

graph <- abjData::pnud_muni %>%
  group_by(ano) %>%
  dplyr::summarise(espvida = mean(espvida),
                   rdpc = mean(rdpc))

ggplot(data=graph, aes(x=as.character(ano), y=espvida, color = espvida, group = 1)) +
  geom_line() +
  geom_point() +
  xlab('Ano') +
  ylab('Expectativa de vida') +
  theme_ipea(type = 'continuous', style = 'color',
             label = 'espvida',
             legend.position = 'none') +
  ggtitle(label = "Expectativa de vida", subtitle = "Brasil (%)")
rafapereirabr commented 1 year ago

Ok, mas como define a paleta de cores? E se o gráfico precisar definir paleta de color e de fill? Eu nao sei se seria uma boa ter uma unica função theme_ipea() que junta tudo. Isso é inclusive contra-intuitivo porque é diferente de como o padrão do ggplot funciona.

Meus two cents. Faria mais sentido ser:

As funções scale_color_ipea() e scale_fill_ipea() poderiam ser construidas como wrap de scale_*_brewer(). Deixaria bem mais facil manutenção e consistencia, a gente poderia deixar opções de paletas predefinidas entre continua e discreta conforme as paletas definidas pelo editorial.

rafapereirabr commented 1 year ago

Exemplo que eu falei acima:

library(ggplot2)

data("mtcars")

# cria funcao scale_color
scale_color_ipea <- function(continua = TRUE,
                             type = 'seq',
                             palette = 1,
                             direction = 1, ...){

  if(isTRUE(continua)){
  cores <- ggplot2::scale_fill_distiller (
                      type = type,
                     palette = palette,
                     direction = direction,
                     aesthetics = "colour", ...)
  }

  if(isFALSE(continua)){
    cores <- ggplot2::scale_color_brewer(
      type = type,
      palette = palette,
      direction = direction,
      aesthetics = "colour", ...)
  }
  return(cores)
  }

  # figura com core continua
  ggplot(data = mtcars) + 
    geom_point(aes(x = disp, y = hp, color= disp)) +
    scale_color_ipea(continua = T, palette = 'Blues')

 # figura com core discreta
  ggplot(data = mtcars) + 
    geom_point(aes(x = disp, y = hp, color= as.factor(gear))) +
    scale_color_ipea(continua = F, palette = 'Blues')
PedroJorge7 commented 1 year ago

A sua sugestão é como está sento feito atualmente. A única diferença é que o argumento da 'continua' você colocou dentro da função do scale_*_ipea

Vai ficar mais claro no comparativo do graf1 e graf2

# Exemplo 4 - Mapa do Brasil  -------------
mun = geobr::read_municipality()
uf  = geobr::read_state()
pnud = abjData::pnud_muni %>%
  subset(ano == 2010) %>%
  select(ano,code_muni = codmun7,e_anosestudo,rdpc)
df = left_join(mun, pnud)
a = subset(df,abbrev_state == "PB")
graf1 <- ggplot(data = a, aes(fill = e_anosestudo)) +
  geom_sf() +
  #geom_sf(data = uf, color = "black", fill = NA) +
  ggtitle("Anos de estudo", "Em anos") +
  xlab("")+ylab("") +
  ipea_style(axis = "full", text = F) +
  scale_fill_continuous_ipea( options = c("ipea1"))

graf1
# Caso deseja mudar a variação da escala
graf2 <- ggplot(data = df, aes(fill = e_anosestudo)) +
  geom_sf(color = NA) +
  geom_sf(data = uf, color = "black", fill = NA) +
  ggtitle("Anos de estudo", "Em anos") +
  xlab("")+ylab("") +
  theme_ipea(axis = "none", text = F,
             show.limits = T,name = "Anos de estudo",
             type = 'continuous', style = 'fill')
graf2
PedroJorge7 commented 1 year ago

Sobre o theme_ipea escolher a paleta, seria só colocar options = c("ipea1")

rafapereirabr commented 1 year ago

Oi Pedro. Me parece que são coisas bem distintas.

Se você reparar na estrutura interna da função atual do pacote scale_fill_continuous_ipea() , você vai ver que um tanto diferente da função scale_color_ipea() que propus acima. A função atual parece bem mais 'complicada' internamente e colocar como opção varias paletas de cores que nao são muito intuitivas. Convenhamos, qual é a cor da paleta "ipea1"? rsrsrsrs

mas enfim, desculpa cair de paraquedas aqui. Se voce e @cavalcanti1985 quiserem, podemos fazer uma reunião para discutir a arquitetura de como o pacote deve funcionar, as funções que fazem sentido existir ou nao etc etc.

PedroJorge7 commented 1 year ago

A ideia de ter várias paletas seria caso o usuário quisesse escolher outras opções além do padrão, mas concordo que não faria tanto sentido. A ideia seria o uso mais frequente do ipea1, ipea2 e ipea3 (que tbm poderíamos escolher outras cores).

A cor da paleta acredito que poderia alterar, mas o que tinha pensado inicialmente era selecionar as cores que mais se adequem ao padrão do ipea. Caso achem melhor simplesmente usar o 'blues' posso alterar isso também.

image

lucasmation commented 1 year ago

my two cents: eu acho que o usuario espera algo como:

d %>% ggplot(....) + geom_*() + theme_classic

o theme_classic, escolhe tudo pra mim, fonte, tags de eixo, paleta de cores (sejam cores discretas ou continua).

Eu esperava que o theme_ipea fizesse o mesmo tem ter que usar opcao nenhuma.

Se alem disso voce quiser expor ao usuario funcoes como "scale_fill_continuous_ipea" (e/ou como argumentos de theme_ipea), e diferentes paletas Ipea, tudo bem.

mas o mais importante na minha opiniao e' para este pacote ter alguma chance de pegar, o usuario nao ter que fazer nada. So digita + theme_ipea e o grafico ja se aproxima ao maximo do que seria o padrao do Ipea.

Off topic: E acho que este exercicio pode sevir para um debate com o editorial para abolir esta paleta de cores especifica do Ipea, em prol das paletas feitas por experts. Mas enfim, seja qual for o consenso, precisamos automatiza-lo ao maximo

rafapereirabr commented 1 year ago

Meu ponto é que o no ggplot2, as paletas de cores dos dados não são definidas dentrod o theme_. Qualquer theme_classic(), theme_void(), theme_map()etc etc ainda exige que o usuario defina a pela de cores dos dados comscalecolorouscalefill`.

ps. tambem acho as paletas 'default' do editorial do Ipea muito muito ruins.

lucasmation commented 1 year ago

Saquei. Eu to na cabeça algo como isso aqui https://r-charts.com/ggplot2/themes/ nos varios exemplos acho que as paletas mudam. mas, como voce diz Rafa, acho que talvez isso nao seja verdade para os themes que vem no proprio ggplot2 (classi,bw,minimal),

rafapereirabr commented 1 year ago

Ah, entendi melhor que você quer dizer. Esses exemplos são bacanas. Uma alternativa é o que faz o pacote {ggsci}.

Mas como eu comentei com o pessoal, a paleta de cores dos TDs é muito ruim. A sugestão de deixar scale_color_ipea(palette = c("blues1", "blues2", "blues3")) seria uma forma de dar liberdade para o pesquisador escolher de um leque de opções de paletas aceitas pelo editorial aquela que ele achar que fica melhor para a figura.