Разрыв линии с помощью d3/linechart

Я пытаюсь повторить следующий график, полученный с R"s ggplot2с rCharts/d3 библиотека (датафрейм df определен ниже):

ggplot(data = df, aes(x = Year, y = value, 
    group = interaction(variable,Category), 
    colour = variable, shape = variable)) + geom_line() 

Я не смог сгруппировать по взаимодействию переменных, как с ggplot пример:

nPlot(data = df, value ~ Year, 
    group = 'variable', 
    type = 'lineChart')

К сожалению, последние и первые пункты двух серий связаны (между 1870 и 2010 годами), что, конечно, нежелательно. Замена group = 'variable' с чем-то вроде group = interaction(df$variable, df$Category) не дал ничего полезного.

Есть идеи, как не соединить точки между двумя сериями?

Здесь есть связанный с этим вопрос SO. Рисование непостоянных линий с помощью d3 дает многообещающий ответ. Но исходя из rCharts и не быть знакомым с d3 Я не смог адаптировать предложенное там решение к моей ситуации.

Я попытался адаптировать код, найденный здесь http://bl.ocks.org/mbostock/3035090, на котором основан ответ SO, но я недостаточно знаком с d3 а также rCharts чтобы это работало. То, что я пытался сделать, это добавить NaN точка данных и не отображать NaNЭто то, что я понимаю, сделано в примере выше. Я не был успешным, но вот моя попытка в любом случае:

df2 <- subset(df, Year %in% 1870)
df2$Year <- 1869  # add non-numeric entry at 1869 
                  # break the interpolation between 1870 and 2010?
df2$value <- NaN
df <- rbind(df, df2)
n <- nPlot(data = df, value ~ Year, group = 'variable', type = 'lineChart')
n$setTemplate(afterScript = 
  '<style>  # code snippet copied from Mike Bostock's example
  var line = d3.svg.line()
    .defined(function(d) { return !isNaN(d.dataValue); })
  </style>')
n

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

Вот кадр данных для репликации графиков:

df <- structure(list(Year = c(1870, 1880, 1890, 1900, 1910, 1920, 1930, 
1940, 1950, 1960, 1970, 1980, 1990, 2000, 2010, 1870, 1880, 1890, 
1900, 1910, 1920, 1930, 1940, 1950, 1960, 1970, 1980, 1990, 2000, 
2010, 1870, 1880, 1890, 1900, 1910, 1920, 1930, 1940, 1950, 1960, 
1970, 1980, 1990, 2000, 2010, 1870, 1880, 1890, 1900, 1910, 1920, 
1930, 1940, 1950, 1960, 1970, 1980, 1990, 2000, 2010, 1870, 1880, 
1890, 1900, 1910, 1920, 1930, 1940, 1950, 1960, 1970, 1980, 1990, 
2000, 2010, 1870, 1880, 1890, 1900, 1910, 1920, 1930, 1940, 1950, 
1960, 1970, 1980, 1990, 2000, 2010), Category = structure(c(2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("National capital", 
"Private capital", "Public capital"), class = "factor"), variable = structure(c(2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("United States", 
"Germany", "France", "United Kingdom", "Europe"), class = "factor"), 
    value = c(7.1, 6.9, 6.3, 6.5, 6.4, 3.5, 3.8, 2.9, 2.3, 3, 
    3.1, 3.5, 3.6, 3.9, 4.1, 0.7, 0.5, 0.3, 0.4, 0.4, 1, 0.7, 
    0.2, 0.7, 0.9, 0.8, 0.7, 0.4, 0.1, 0, 7.2, 7, 7, 7, 6.7, 
    2.9, 3.8, 2.8, 2.8, 3.2, 3.6, 3.7, 3.7, 5, 6.1, 0.2, -0.4, 
    -0.3, -0.3, -0.3, -0.4, 0.4, -0.3, 0.6, 0.4, 0.5, 0.4, 0.3, 
    0.3, 0.3, 6.7, 6.8, 6.8, 6.8, 6.8, 2.9, 3.6, 2.6, 2.3, 2.8, 
    3.3, 4, 4.6, 4.9, 5.2, -0.2, 0.4, 0.7, 0.3, 0.1, -1.5, -1.5, 
    -1.4, -0.8, -0.3, 0.2, 0.5, 0.3, 0, 0)), .Names = c("Year", 
"Category", "variable", "value"), row.names = c(NA, -90L), class = "data.frame")

1 ответ

Решение

Создание нового столбца в вашем фрейме данных с взаимодействием и последующая группировка по этому столбцу в nPlot вместо выполнения взаимодействия в nPlot, похоже, решают проблему:

df$interaction=interaction(df$variable,df$Category)
nPlot(data = df, value ~ Year, 
  group = 'interaction', 
  type = 'lineChart')

Возможно, вам придется изменить легенду

Другие вопросы по тегам