Групповые гистограммы с использованием R - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь построить гистограмму группы в R. На данный момент я использую пакет highcharter, но если это можно сделать в любой другой библиотеке, это было бы хорошо.Вот к чему я пытаюсь добраться:

enter image description here Ниже приведен код

spend_opt_tv <-tibble::tribble(
  ~Channel,   ~Network,                 ~Daypart,        ~Lower,     ~Current,          ~Upper, ~Optimized.Budget,        ~CPM,
    "TV 1",      "NBC",                  "Other",  "$13,790.50",    "$27,581",    "$41,371.50",         "$41,372", "$4,555.00",
    "TV 2",      "NBC",      "Weekday Afternoon",  "$97,680.00",   "$195,360",   "$293,040.00",        "$237,904", "$3,964.00",
    "TV 3",      "NBC",   "Weekday Early Fringe", "$160,129.50",   "$320,259",   "$480,388.50",        "$160,132", "$4,190.00",
    "TV 4",      "NBC",    "Weekday Late Fringe", "$110,546.00",   "$221,092",   "$331,638.00",        "$185,136", "$4,491.00",
    "TV 5",      "NBC",        "Weekday Morning", "$226,253.00",   "$452,506",   "$678,759.00",        "$354,960", "$6,206.00",
    "TV 6",      "NBC",               "Weekends",  "$35,880.00",    "$71,760",   "$107,640.00",        "$107,640", "$4,147.00",
    "TV 7",      "CBS",                  "Other",  "$95,873.50",   "$191,747",   "$287,620.50",        "$238,774", "$5,145.00",
    "TV 8",      "CBS",             "Prime Time",  "$57,645.00",   "$115,290",   "$172,935.00",         "$57,647", "$3,951.00",
    "TV 9",      "CBS",               "Weekends",  "$18,915.00",    "$37,830",    "$56,745.00",         "$56,747", "$3,531.00"
  )

network_grouped <- spend_opt_tv %>% 
  group_by(name = Network) %>% 
  do(categories = .$Daypart) %>% 
  list_parse()

highchart() %>% 
 hc_xAxis(categories = network_grouped) %>% 
  hc_add_series(data = spend_opt_tv, type = "bar" , hcaes(y = Current, color = Daypart),
                showInLegend = FALSE)

1 Ответ

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

Сначала вам придется очистить столбец Current от нечисловых значений.

spend_opt_tv$Current <- as.numeric(gsub("[^0-9.-]", "", spend_opt_tv$Current))

Чтобы показать вам график, я немного расширил ваши данные (см. Ниже).

Сюжет, который вы можете сделать с помощью встроенных функций R.( Примечание: Обрезать данные до столбцов df1.)

# reshape data
df2 <- as.data.frame.matrix(xtabs(Current ~ Daypart + Network, df1))

# choose colors
colors <- rainbow(7, s=.9, v=.8, start=.15, end=.7)

# plot & legend    
barplot(as.matrix(df2), beside=TRUE, col=colors, horiz=TRUE, 
        border="white", main="TV Plot", xlab="Current", ylab="Network")
legend(950000, 8, rownames(data), fill=colors, border="white")

enter image description here

Или использовать ggplot2.

library(ggplot2)
ggplot(df1, aes(x=Network, y=Current, fill=Daypart)) + 
  geom_bar(stat="identity", position=position_dodge()) +
  coord_flip() + labs(title="TV Plot") + theme_bw()

enter image description here


Расширенные данные

df1 <- structure(list(Network = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("NBC", "CBS"), class = "factor"), 
    Daypart = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 
    3L, 4L, 5L, 6L, 7L), .Label = c("Other", "Weekday Afternoon", 
    "Weekday Early Fringe", "Weekday Late Fringe", "Weekday Morning", 
    "Weekends", "Prime Time"), class = "factor"), Current = c(27581, 
    195360, 320259, 221092, 452506, 71760, 191747, 96534, 683760, 
    1120906, 773822, 1583771, 251160, 671114)), out.attrs = list(
    dim = c(2L, 7L), dimnames = list(Var1 = c("Var1=NBC", "Var1=CBS"
    ), Var2 = c("Var2=Other", "Var2=Weekday Afternoon", "Var2=Weekday Early Fringe", 
    "Var2=Weekday Late Fringe", "Var2=Weekday Morning", "Var2=Weekends", 
    "Var2=Prime Time"))), row.names = c(NA, -14L), class = "data.frame")
...