Разрыв линии с помощью 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')
Возможно, вам придется изменить легенду