2015-02-06 5 views
2

У меня есть dataframe, который выглядит как:Пользовательские легенды в rCharts (Highcharts)

## Data 
df <- data.frame(label = c("A", "B", "C", "D"), 
       color = c("red", "red", "blue", "green"), 
       y = c(10, 11, 12, 13)) 

«A» и «B» являются частью одной и той же категории, в то время как «C» и «D» являются частью отдельные категории.

Я хотел бы добавить легенду на диаграмме с надписью категории.

## Highchart without Legend 

## Basic highchart 
h <- rCharts:::Highcharts$new() 
h$chart(type = "column") 

## Highchart data: 
h$series(showInLegend = FALSE, data = rCharts::toJSONArray2(df[, c("label", "color", "y")], json = FALSE, names = TRUE)) 

## Highchart options: 
h$xAxis(categories = unique(df$label), labels = list(rotation = 0, align = 'center', style = list(fontSize = '12px', fontFamily = 'Verdana, sans-serif')), replace = FALSE) 
h$tooltip(formatter = "#! function() {return this.x + ': ' + this.y; } !#") 
h$plotOptions(series = list(color = df$color), column = list(grouping = FALSE)) 
h # display highchart 

enter image description here

Я не нашел способ, который имеет смысл, чтобы решить эту проблему.

Любая помощь будет оценена по достоинству.

ответ

1

И вот как я решил это.

Каждая «категория» делится на отдельную серию со значением x, чтобы определить ее местоположение на графике (для этого необходимы пошаговые диаграммы). Без него стек графов).

Вот пример кода, который работает:

## Highchart with Legend 
## Remark: simply switching showInLegend to TRUE will not work 
df$x <- c(0, 1, 2, 3) # add an index to dataframe (starting from 0) 
         # and pass it to h$series data 
h <- rCharts:::Highcharts$new() 
h$chart(type = "column") 
h$series(name = "Category 1 (Red)", color = "red", data = rCharts::toJSONArray2(df[df$color == "red", c("label", "color", "x", "y")], json = FALSE, names = TRUE)) 
h$series(name = "Category 2 (Blue)", color = "blue", data = rCharts::toJSONArray2(df[df$color == "blue", c("label", "color", "x", "y")], json = FALSE, names = TRUE)) 
h$series(name = "Category 3 (Green)", color = "green", data = rCharts::toJSONArray2(df[df$color == "green", c("label", "color", "x", "y")], json = FALSE, names = TRUE)) 
h$xAxis(categories = unique(df$label), labels = list(rotation = 0, align = 'center', style = list(fontSize = '12px', fontFamily = 'Verdana, sans-serif')), replace = FALSE) 
h$tooltip(formatter = "#! function() {return this.x + ': ' + this.y; } !#") 
h$plotOptions(series = list(color = df$color), column = list(grouping = FALSE)) 
h # display chart 

enter image description here

Я надеюсь, что это поможет кому-то еще.

3

Отказ от ответственности: Я знаю, что вопрос говорит rCharts, я просто хочу добавить альтернативу, используя пакет highcharter.

Как @Optimus сказал, проблема заключается в добавлении кратных серий. Если у вас есть количество серий (цветов в вашем примере) и вы хотите добавить его автоматически, вы можете использовать highcharter, чтобы вы могли добавлять серии кратных из списка рядов данных с помощью функции hc_add_series_list.

library(highcharter) 
library(dplyr) 

df <- data_frame(label = c("A", "B", "C", "D"), 
       color = c("red", "red", "blue", "green"), 
       y = c(10, 11, 12, 13), 
       x = c(1:4)-1) 

head(df) 

series <- df %>% 
    group_by(color) %>% # each serie is from one color 
    do(data = list.parse3(.)) %>% 
    ungroup() %>% 
    mutate(name = paste("I'm color", color)) %>% 
    list.parse3() 

Здесь list.parse3 похож на toJSONArray2.

series[[1]] 

$color 
[1] "blue" 

$data 
$data[[1]] 
$data[[1]]$label 
[1] "C" 

$data[[1]]$color 
[1] "blue" 

$data[[1]]$y 
[1] 12 

$data[[1]]$x 
[1] 2 

$name 
[1] "I'm color blue" 

Наконец:

highchart() %>% 
    hc_chart(type = "column") %>% 
    hc_add_series_list(series) %>% 
    hc_xAxis(categories = df$label) %>% 
    hc_plotOptions(column = list(grouping = FALSE)) 

Результат будет:

result

+0

Я знаю, что вы [DEV из highcharter] (http://chat.stackoverflow.com/transcript/25312? m = 31229611 # 31229611). Но, однако, когда вы используете пакет, перейдите на страницу [Страница CRAN] (https://cran.r-project.org/web/packages/highcharter/index. html), а затем на домашнюю страницу. Были случаи, когда пользователи отмечали законный ответ как «чрезмерное», думая, что пользователь продвигает какой-то пакет. Общие пользователи могут не знать, что вы являетесь разработчиком пакета. Просто позаботьтесь в следующий раз и извинитесь, если я ошибаюсь в этом. С уважением –

+0

@BhargavRao, Полностью согласен. Имеют смысл. На самом деле это частично способствует распространению информации о другом пакете с упрощением некоторых задач (в этом случае добавьте многократные ряды данных). Я отредактирую ответ, чтобы связать сайт CRAN и переместить главную страницу в конце ответа. Благодаря! – jbkunst

+1

Спасибо за это, посетите [R Public] (http: //chat.stackoverflow.com/rooms/25312/r-public), когда вы свободны. Это общедоступный чат, где мы помогаем новым пользователям изучать R. (Вчера возникла проблема с новым пользователем, использующим highcharter вчера, который был разобран). –

Смежные вопросы