сюжетно не получая geom_text в R/ggplot

У меня есть ggplot, который отлично работает сам по себе. Но когда я пытаюсь импортировать его в систему plotly api, geom_text, кажется, не работает - все остальное работает. Может кто-нибудь помочь мне?

Вот моя версия R - версия R 3.1.2 (31.10.2014) и сюжетная версия - 0.5.23.

Данные, которые я использую, находятся в файле .csv и выглядят так:

Province,Community,General Shelters,General Beds,Mens Shelters,Mens Beds,Womens Shelters,Womens Beds,Youth Shelters,Youth Beds,Family Shelters,Family Beds,Total Shelters,Total Beds
New Brunswick,Saint John,0,0,1,35,1,10,0,0,0,0,2,45
Quebec,Montréal,7,114,9,916,12,259,17,197,1,7,45,"1,493"
Quebec,Québec City,3,49,2,102,1,12,2,15,0,0,8,178
Ontario,Toronto,4,250,13,"1,483",10,572,10,416,4,496,41,"3,217"
British Columbia,Vancouver,13,545,7,291,9,238,7,90,2,30,38,"1,194"
British Columbia,Victoria,1,84,1,21,1,25,1,10,1,5,5,145

И вот мой полный код:

library(ggplot2)
library(zoo)
library(DAAG)
library(mapdata) #for canada map from worldhires database
library(ggmap)
library("plotly") # for plotly

homeless <- function()
{
    allcit <- NULL

    #read csv
    allcittmp <- read.csv("file.csv", sep=",", header=TRUE, colClasses="character")

    #cast data to proper format from character for both data frames
    allcittmp[,1] <- as.character(allcittmp[,1])
    allcittmp[,2] <- as.character(allcittmp[,2])
    allcittmp[,13] <- as.integer(allcittmp[,13])
    allcittmp[,14] <- as.integer(gsub(",","",allcittmp[,14]))

    #get only relevant columns to a new data frame
    allcit <- allcittmp[,c(1,2,13,14)]

    #delete temp data frames for hygiene
    allcittmp <- NULL

    #give better colnames
    colnames(allcit) <- c("prov","community","totshelters","totbeds")

    #concatenate col2,1 to get city, province
    allcit$hcity <- paste(allcit$community,allcit$prov, sep=", ")

    #clean up NA's
    allcit <- na.omit(allcit)

    plmap <- mapcit3(allcit$hcity, allcit$totshelters, allcit$community)

    #the following two lines commented out makes plotly graph
    #everything is fine except that the city names don't show up 
    #py <- plotly()
    #py$ggplotly(plmap)

}

mapcit3 <- function(citiesM, indM, cityname)
{
    #concatenate Canada to city names, to be safe and not pick up similar US cities:
    citiesM <- paste(citiesM,", Canada", sep="")

    freqM <- data.frame(citiesM, indM, cityname) #make dataframe
    lonlat <- geocode(citiesM) #courtesy of google, logitude, lattitude      (gives two var's lon, lat among others)
    citiesC <- cbind(freqM,lonlat) #make new df with long/lat

    mappts2 <- ggplot(citiesC, aes(lon, lat)) +
            borders(regions="canada", name="borders") +
            coord_equal() +
            geom_point(aes(text=cityname, size=indM), colour="red", alpha=1/2, name="cities", label=citiesC$cityname) +
            geom_text(size=2, aes(label=cityname),hjust=0, vjust=0)

    return(mappts2)
}

Прикреплен как map1_without_plotly.png версия без сюжета:карта без сюжетаИ карта с сюжетом, которая появляется на сюжете сайт как API:map with plotly API(да, в сюжетной версии больше городов, но это потому, что я убрал CSV-файл для переполнения стека, поэтому его легко воспроизвести)

Но в основном в сюжетной версии отсутствуют geom_text (названия городов), которые есть в не сюжетной версии.


person petiteparticule    schedule 16.03.2015    source источник
comment
Вы по-прежнему можете публиковать ссылки на свои изображения.   -  person tonytonov    schedule 16.03.2015
comment
готово... Я думаю, что размещение этого дало мне достаточно очков, так что теперь я мог прикрепить изображения.   -  person petiteparticule    schedule 16.03.2015


Ответы (2)


Хорошо, я заметил несколько недостатков в преобразовании ggplotly. На данный момент могу предложить следующий обходной путь:

mappts2 <- ggplot(citiesC, aes(x=lon, y=lat)) +
  geom_text(size=10, aes(label=cityname), hjust=0, vjust=0) +
  borders(regions="canada", name="borders") +
  coord_equal() +
  geom_point(aes(text=cityname, size=indM), colour="red", alpha=0.5,
             name="cities", label=citiesC$cityname)
# Take a look
mappts2
# Yes, text is too big in ggplot2

first_version <- py$ggplotly(mappts2, kwargs=list(filename="map_text",
                                                  fileopt="overwrite"))
# Has the labels, misses the markers

my_account <- "marianne2"  # Replace with yours
account_url <- paste0("https://plot.ly/~", my_account, "/")
plot_number <- as.integer(gsub(account_url, "", first_version$response$url))

text_marker <- py$get_figure(my_account, plot_number)

text_marker$data[[1]]$mode
# Says "text"
text_marker$data[[1]]$mode <- "text+markers"
final_version <- py$plotly(text_marker$data,
                           kwargs=list(layout=text_marker$layout,
                                       fileopt="overwrite",
                                       filename="text_markers_mode"))

# Visit final_version$url
  • Преобразование размера не идеально, поэтому я заменил size=2 на size=10.

  • К сожалению, аргументы hjust и vjust не поддерживаются (здесь игнорируются).

  • Когда geom_text и geom_point используются для одних и тех же данных, ggplotly следует установить mode="text+markers", чего в настоящее время нет в пакете R "plotly" (версия 0.5.25).

person mkcor    schedule 16.03.2015

read.csv() имеет значения по умолчанию header=TRUE, sep=",", поэтому вам не нужно их указывать.

Если вы запустили allcittmp <- read.csv("file.csv", colClasses="character"), вам не нужно выполнять

for (i in c(1, 2)) {
    allcittmp[, i] <- as.character(allcittmp[, i])
}

потому что именно об этом заботится colClasses="character".

Мне не очень нравится функция mapcit3(), которая, кажется, выполняет некоторую обработку, а затем рисует (?!).

person mkcor    schedule 16.03.2015
comment
Хорошо, конечно для 1 и 2. Но 13 должно быть целым числом. В любом случае, это не решит мою проблему с названиями моих городов, которые не отображаются на сюжетной карте. - person petiteparticule; 16.03.2015
comment
mapcit3 не выполняет никакой сложной обработки. Он просто минимально создает фреймы данных из переданных значений, поэтому я мог вызвать ggplot для создания своей карты. Поскольку R не выполняет никаких передач по ссылке и т. д., я не уверен, как это изменит тот факт, что я не получаю названия городов в ggplot. Если вас это беспокоит, прямо под строкой cityC ‹- cbind(freqM,lonlat) вы можете поместить print(citiesC), чтобы увидеть, что она по-прежнему дает нормальный фрейм данных. - person petiteparticule; 16.03.2015
comment
Конечно, я думаю, мне следовало опубликовать это как комментарий, а не как ответ. - person mkcor; 18.03.2015