ggplot scale_fill_manual путем поиска значений подстановки / подстановки - PullRequest
0 голосов
/ 26 февраля 2019

Я зацикливаю функцию для расчета рас для всех студентов на всех курсах в моем кампусе, затем объединяю расы и оценки, которые они получили в курсе, чтобы создать распределение оценок.Я также добавляю гоночную сумму к гонке (например, афроамериканец (192)), чтобы указать количество студентов в каждой расовой группе.Затем я строю эти данные для каждого курса (более 600 курсов, следовательно, цикл).Моя проблема в том, что когда я присваиваю scale_fill_manual цвета каждой расовой категории, она терпит неудачу, потому что расовая категория меняется от одной итерации к следующей: в первой это может быть афроамериканец (192), а во второй - афроамериканец (87)поэтому я не могу выбрать значение scale_fill_manual ... то есть я не могу кодировать

scale_fill_manual(values = c("African American"="violetred1","Asian"="orange3)

, потому что название каждой расовой группы постоянно меняется.Итак, мой вопрос, есть ли способ, подобно SQL, применить подстановочный знак к значению ... что-то вроде:

scale_fill_manual(values = c("African American*"="violetred1","Asian*"="orange3) 

Или, возможно, есть лучший способ сделать это?

edit: у меня есть столбцы для race, count и racecount, выглядящие так:

African American, 192, African American (192)

, так что если есть способ заполнить racecount, значит, подпись легенды для каждой группы - Race (считать), но затем назначить scale_fill_manual столбцу расы, где группы остаются прежними, это может сработать, но я не знаю, как это сделать.

Вот воспроизводимый пример:

library(tidyverse)
library(extdplyr)
library(pacman)
p_load_gh("trinker/wakefield")
set.seed(10)

df1<-dplyr::data_frame(
  ID = wakefield::id(n=100), 
  Race = race(n=100),
  Course = group(n=100),
  Grade =sample(1:5,100,replace=T))



df1

courselist=list("Treatment","Control")


myplot<-function(coursegrade){

  coursegrade<-as.character(coursegrade)
  subject<-df1%>%filter(Course==coursegrade)
  percents<- pct_routine(subject, Race, Grade)
  dat2 = subject %>%
    group_by(Race) %>%
    summarise(Count = n())
  percents<-inner_join(percents, dat2, by = "Race") 
  percents$Count <- with(percents, paste0("(", Count, ")"))
  percents$Race.Eth <- paste(percents$Race, percents$Count)
  percents$pct<-percents$pct*100

  temp_plot=ggplot(percents,aes(fill=Race.Eth, y=pct, x=Grade)) + 
    geom_bar(position="dodge", stat="identity", colour="black", width = .8) +
    ggtitle("Grade Distributions by Race, 2015 - 2018", subtitle = coursegrade) + 
    theme(plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust = .5)) +
    scale_y_continuous(limits=c(0,70)) 



  ggsave(temp_plot, file=paste0(coursegrade," - grade distribution.jpg"), width = 13, height = 7, units = "in")
  print(temp_plot)
}

lapply(courselist,myplot)

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Как уже упоминалось @ user2362777, лучше не выполнять эту маркировку в пределах фрагментов кода ggplot.Попробуйте создать новый столбец или отредактировать исходный столбец для «расы» перед подачей в gg.

В число возможных вариантов входят:

Есть другие сообщения, похожие на это на SO: https://stackoverflow.com/search?q=%5Br%5D+partial+string+match+replace

0 голосов
/ 26 февраля 2019

Вы можете избежать этой проблемы, добавив сумму к метке в своем коде ggplot только там, где она вам действительно нужна.Например, предположим, что вы используете его только в заголовке вашего графика, затем оставьте метку «афроамериканец» повсюду (чтобы вы могли сопоставить ее с цветом) и используйте labs(title = paste0(my_label, " (", my_count, ")")), где my_label будет соответствовать »Афроамериканец "и my_count на счет.

...