Добавете заглавие на сюжет към ggvis

Искам да добавя заглавие към сюжет на ggvis. Никъде не мога да намеря пример. Лесно е да се направи с други R диаграми, напр.

library(ggplot2)
library(ggvis)
x <- 1:10
y <- x^2
df <- data.frame(x, y)

plot(x, y, main = "Plot Title")  # Base R with title
ggplot(df, aes(x, y)) + geom_point() + ggtitle("Plot Title")  # ggplot2 with title
df %>% ggvis(~x, ~y) %>% layer_points()  # ggvis but no title??

Имам чувството, че пропускам нещо очевидно. Всяка помощ се оценява.


person Anto    schedule 29.07.2014    source източник


Отговори (3)


Е, изглежда, че все още не е внедрено (или документирано?). Почти съм сигурен, че това ще бъде добавено скоро. Засега можете да използвате мръсен хак като този:

df %>% ggvis(~x, ~y) %>% layer_points() %>% 
  add_axis("x", title = "X units") %>%
  add_axis("x", orient = "top", ticks = 0, title = "Plot Title",
           properties = axis_props(
             axis = list(stroke = "white"),
             labels = list(fontSize = 0)))

Освен това, ако искате да използвате този хак няколко пъти, можете да създадете стенограма за него.

add_title <- function(vis, ..., x_lab = "X units", title = "Plot Title") 
{
  add_axis(vis, "x", title = x_lab) %>% 
    add_axis("x", orient = "top", ticks = 0, title = title,
             properties = axis_props(
               axis = list(stroke = "white"),
               labels = list(fontSize = 0)
             ), ...)
}
df %>% ggvis(~x, ~y) %>% layer_points() %>% add_title() #same as before
df %>% ggvis(~x, ~y) %>% layer_points() %>% add_title(title = "Hello", x_lab = "ton")

Редактиране:

Сега можете да зададете както основното заглавие, така и етикета на оста x едновременно, като коригирате припокриването, споменато по-долу.

person tonytonov    schedule 30.07.2014
comment
Благодаря Тони. Понякога хаковете могат да създадат повече проблеми, отколкото си заслужават, но това е чудесно! - person Anto; 31.07.2014
comment
Вие сте добре дошъл! Ще се опитам да не забравя да актуализирам тази публикация веднага щом се появи по-елегантно естествено решение. - person tonytonov; 01.08.2014
comment
За съжаление този хак е несъвместим със задаване на етикет на действителната ос x. Следното показва, че етикетът на оста x припокрива оригиналния етикет wt, когато се използва add_title(). Изглежда като грешка в ggvis. mtcars %>% ggvis(~wt, ~mpg) %>% layer_points() %>% add_axis("x", title = "long axis label") %>% add_title(title = "Any Title") - person Chris Warth; 21.10.2014
comment
@ChrisWarth Опитайте корекцията, която предложих, изглежда върши работа. - person tonytonov; 23.10.2014
comment
@dsh Въпреки че предложената от вас редакция беше отхвърлена от рецензенти, тя всъщност беше полезна. Актуализирах отговора и се уверих, че работи, въпреки че пропуснах спецификацията type = , тъй като е излишна (поддържа се от първия пример в ?add_axis). Както и да е, просто исках да благодаря за усилията ви и смисленото обяснение за редактиране. - person tonytonov; 13.01.2015
comment
@tonytonov Някаква идея как мога да напиша заглавието на два отделни реда? Особено когато имам много дълго заглавие. - person HNSKD; 06.09.2016
comment
Изглежда, че все още не е внедрен. Заобиколно решение: добавете друга ос и задайте title_offset, напр. до 10. - person tonytonov; 06.09.2016

Също така, за да промените размера на шрифта на заглавието, използвайте този код (адаптиран от отговора на @tonytonov):

add_title <- function(vis, ..., x_lab = "X units", title = "Plot Title") 
{
  add_axis(vis, "x", title = x_lab) %>% 
    add_axis("x", orient = "top", ticks = 0, title = title,
             properties = axis_props(
               axis = list(stroke = "white"),
               title = list(fontSize = 32),
               labels = list(fontSize = 0)
             ), ...)
}
person resamsel    schedule 05.02.2015

Актуализирах отговора на @tonytonov, за да не пречи на оста X по подразбиране. Той все още се прилага като ос, но прилага свой собствен мащаб на „заглавието“ и правилно обединява предоставените от потребителя свойства на заглавието като размер на шрифта и цвят със свойствата по подразбиране, необходими, за да направи оста невидима. Тази версия скрива оста, без да предполага определен цвят на фона. Три примера следват функцията.

library(ggvis)

# ggvis lacks a plot title function, so add one.
# based on clever hack by tonytonov
# http://stackoverflow.com/a/25030002/1135316
add_title <- function(vis, ..., properties=NULL, title = "Plot Title") 
{
    # recursively merge lists by name
    # http://stackoverflow.com/a/13811666/1135316
    merge.lists <- function(a, b) {
        a.names <- names(a)
        b.names <- names(b)
        m.names <- sort(unique(c(a.names, b.names)))
        sapply(m.names, function(i) {
                   if (is.list(a[[i]]) & is.list(b[[i]])) merge.lists(a[[i]], b[[i]])
                   else if (i %in% b.names) b[[i]]
                   else a[[i]]
               }, simplify = FALSE)
    }

    # default properties make title 'axis' invisible
    default.props <- axis_props(
        ticks = list(strokeWidth=0),
        axis = list(strokeWidth=0),
        labels = list(fontSize = 0),
        grid = list(strokeWidth=0)
        )
    # merge the default properties with user-supplied props.
    axis.props <- do.call(axis_props, merge.lists(default.props, properties))

    # don't step on existing scales.
    vis <- scale_numeric(vis, "title", domain = c(0,1), range = 'width')
    axis <- ggvis:::create_axis('x', 'title', orient = "top",  title = title, properties = axis.props, ...)
    ggvis:::append_ggvis(vis, "axes", axis)
}

# add title with default X axis.
iris %>% 
  ggvis(x = ~Petal.Width) %>% 
  layer_points(y = ~Petal.Length, fill = ~Species) %>%
  add_title(title = "Petal.Width vs. Petal.Length")

# Add title with overridden X axis
iris %>% 
  ggvis(x = ~Petal.Width) %>% 
  layer_points(y = ~Petal.Length, fill = ~Species) %>%
  add_axis("x", title = "X-axis!!!!", title_offset=40,
           properties = axis_props(title=list(fontSize=16),
               labels = list(fontSize = 12))) %>%
  add_title(title = "Petal.Width vs. Petal.Length")

# Change the font size of the title.
iris %>% 
  ggvis(x = ~Petal.Width) %>% 
  layer_points(y = ~Petal.Length, fill = ~Species) %>%
  add_title(title = "Petal.Width vs. Petal.Length",
            properties = axis_props(title=list(fontSize=20)))
person Chris Warth    schedule 28.06.2016