ggplot2: Отсутствует легенда, когда указывается цвет, используя заливку geom_bar

Вы должны добавить свой собственный параметр закрытия completionHandler и вызвать его, когда задача завершится:

func googleDuration(origin: String, destination: String, completionHandler: (Int?, NSError?) -> Void ) -> NSURLSessionTask {
    // do calculations origin and destiantion with google distance matrix api

    let originFix = origin.stringByReplacingOccurrencesOfString(" ", withString: "+", options: NSStringCompareOptions.LiteralSearch, range: nil);
    let destinationFix = destination.stringByReplacingOccurrencesOfString(" ", withString: "+", options: NSStringCompareOptions.LiteralSearch, range: nil);

    let urlAsString = "https://maps.googleapis.com/maps/api/distancematrix/json?origins="+originFix+"&destinations="+destinationFix
    println(urlAsString)

    let url = NSURL(string: urlAsString)!
    let urlSession = NSURLSession.sharedSession()

    let task = urlSession.dataTaskWithURL(url) { data, response, error -> Void in
        if error != nil {
            // If there is an error in the web request, print it to the console
            // println(error.localizedDescription)
            completionHandler(nil, error)
            return
        }

        //println("parsing JSON");
        let json = JSON(data: data)
        if (json["status"].stringValue == "OK") {
            if let totalTime = json["rows"][0]["elements"][0]["duration"]["value"].integerValue {
                // println(totalTime);
                completionHandler(totalTime, nil)
                return
            }
            let totalTimeError = NSError(domain: kAppDomain, code: kTotalTimeError, userInfo: nil) // populate this any way you prefer
            completionHandler(nil, totalTimeError)
        }
        let jsonError = NSError(domain: kAppDomain, code: kJsonError, userInfo: nil) // again, populate this as you prefer
        completionHandler(nil, jsonError)
    }
    task.resume()
    return task
}

У меня также будет это возвращение NSURLSessionTask в случае, если вызывающий хочет быть в состоянии для отмены задачи.

В любом случае, вы бы назвали это так:

googleDuration(origin, destination: destination) { totalTime, error in
    if let totalTime = totalTime {
        // use totalTime here
    } else {
        // handle error     
    }
}
0
задан Z.Lin 13 July 2018 в 15:10
поделиться

2 ответа

Я использовал предложенный код Зак и добавил «руководства (fill = guide_legend (ncol = 2))». Это график, который я получил

Пересмотренный график

0
ответ дан Hannah Xin Yuan 17 August 2018 в 12:35
поделиться

Я не эксперт в ggplot2, но, думаю, вы теряете легенду, потому что вы удаляете свое эстетическое сопоставление в geom_bar с назначением аргументов fill=Palette. По сути, ваш fill эстетика не только Response, но с помощью комбинации Response и Group, потому что каждая группа имеет свой цвет на тот же ответ (который может быть сомнительной практикой, но это не для меня решить).

Я думаю, что этот код дает вам то, что вы хотите. Я добавил поле helper в data1, чтобы иметь надлежащую эстетику fill. Примечание. Мне нужно было вручную переопределить метки легенды в scale_fill_manual

library(dplyr)
data1<- as.data.frame(data %>% 
    group_by(Group, Time, Response) %>%                     
    summarise(N= n())) %>%
  mutate(helper = as.character(group_indices(., Group, Response)))

# Define the color for control and treatment groups
trtCol <- c("#deebf7", "#9ecae1","#3182bd")
conCol <- c("#e5f5e0", "#a1d99b", "#31a354")
Palette<-c(conCol, trtCol, conCol, trtCol, conCol, trtCol)

library(ggplot2)
library(scales)

# Specify color in ggplot using "geom_bar (fill=Palette)"
ggplot(data1, aes(Group, N, fill = helper)) + 
  facet_wrap(~Time, strip.position = "bottom") +
  labs(title="Distribution of Responses by Groups over Time", x="Time Points", y="Percentage") +
  scale_fill_manual(name = "Response", values = Palette, labels = c(1, 2, 3, 1, 2, 3)) +
  geom_bar(position = "fill",stat = "identity") + 
  scale_y_continuous(labels = percent_format()) + 
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5), axis.text.x=element_blank(), axis.ticks.x=element_blank(), 
        panel.spacing = unit(0.1, "lines"))+
  geom_text(aes(x=0,y=-0.05,label="Control\nGroup"), size=3.5)+
  geom_text(aes(x=1,y=-0.05,label="Treatment\nGroup"), size=3.5)
0
ответ дан zack 17 August 2018 в 12:35
поделиться
  • 1
    Оно работает!!! Спасибо огромное! Проблема заключается в том, что в «aes» я должен указать «fill» как сочетание группы и реакции. Я пропустил группу, поэтому легенда исчезла. – Hannah Xin Yuan 13 July 2018 в 20:18
Другие вопросы по тегам:

Похожие вопросы: