Статьи

Визуализация набора Hiveplots с Neo4j


Как должен выглядеть график и как я могу отличить два графика?


Это вопросы, которые задавал Мартин Крживински (Центр геномных наук, Ванкувер, Британская Колумбия). Посмотрите на картинку ниже:

Это один и тот же график, одни и те же данные, визуализированные 8 разными способами. Какой правильный путь? Какое преимущество дает один макет над другим? Можете ли вы сказать, что это та же сеть? Я не могу

Восемь макетов может быть слишком много, поэтому давайте просто посмотрим на один на следующем рисунке:

Мартин взял весеннюю встроенную визуализацию и подправил ее. Можете ли вы сказать, что это тот же график, те же данные под ним? Я не могу

Чтобы решить эту проблему, Мартин изобрел график Hive , перцептуально однородную и масштабируемую визуализацию компоновки для сетевой визуальной аналитики.

Если вы хотите узнать больше о Hive Plots, взгляните на его веб-сайт и эту презентацию (она довольно большая и составляет 20 МБ). Я не могу отдать должное этому короткому сообщению в блоге, и, честно говоря, у меня не было времени, чтобы изучить его должным образом.

Сегодня я просто хочу дать вам немного вкуса Hiveplots. Я собираюсь визуализировать графики github для девяти языков, о которых вы, возможно, не слышали: Бу, Дилан, Фактор, Госу, Мира, Немерле, Ну, Попугай, Самость. В этот раз я не собираюсь показывать вам, как создать график, потому что это реальные данные, которые мы используем. Вы можете взглянуть на это в папке данных в github.

График в основном: (Язык) — (Репозиторий) — (Пользователь). Существует два отношения между хранилищем и пользователем, написано и разветвлено.

Я покажу вам, как вывести данные в нашу визуализацию.

def wroterepos(language)
  neo = Neography::Rest.new
  neo.execute_script("m = [:]
                      g.V.filter{it.type == 'language' && it.name == '#{language}'}
                       .in.transform{m[it.name] = it.in('wrote').gather{it.name}.next()}
                       .iterate()
                      m")
end

Мы делаем то же самое, но для разветвленных. Это может показаться вам немного странным, но то, что я делаю, похоже на SQL-эквивалент LEFT OUTER JOIN с Gremlin.

def forkedrepos(language)
  neo = Neography::Rest.new
  neo.execute_script("m = [:]
                      g.V.filter{it.type == 'language' && it.name == '#{language}'}
                       .in.transform{m[it.name] = it.in('forked').gather{it.name}.next()}
                       .iterate()
                      m")
end

Теперь мы делаем некоторую магию рубина, чтобы перевести наши данные в формат JSON, необходимый для визуализации.

get '/hive/:name' do
  repos        = []
  writers      = [] 
  forkers      = []
  temp_forkers = []
  temp_writers = []

  wroterepos(params[:name]).each_pair do |key, value|
    repos << {"name" => key, "imports" => value, "node_type" => "repo"}
    temp_writers << { "name" => value[0] }
  end

  i = 0
  forkedrepos(params[:name]).each_pair do |key, value|
    repos[i]["imports"] =  repos[i]["imports"] + value
    temp_writers[i]["imports"] = value
    temp_forkers << value
    i += 1
  end

  temp_writers.group_by {|i| i["name"]}.each do |w, f|
    writers << {"name" => w, 
                "imports" => f.collect{|y| y["imports"]}.flatten.uniq, 
                "node_type" => "writer"}
  end

  temp_forkers.flatten.uniq.delete_if{|x| writers.collect{|y| y["name"]}.include?(x)}.each do |f|
    forkers << {"name" => f, 
                "imports" => [], 
                "node_type" => "forker"}
  end

  (repos + writers + forkers).to_json
end

Узлы синего цвета — это наши репозитории, узлы желтого цвета — наши писатели, а узлы зеленого цвета — наши форкеры. Ось 12 часов (вверху) показывает узлы только с исходящими отношениями. Нижняя левая ось показывает узлы только с входящими отношениями. Это писатели без всяких вилок и те, кто никогда не начинал свои публичные проекты. Остальные узлы в правом нижнем углу имеют как входящие, так и исходящие отношения. Это авторы репозитория, создавшие проекты, которые другие люди сочли нужными.

Графики упорядочены по каждой строке следующим образом:

  • Бу, Дилан, Фактор
  • Госу, Мира, Немерле
  • Ну, попугай, селфи

Можете ли вы увидеть сходство между Boo, Factor и Numerle? Видите, насколько они отличаются от Госу и Самости? Что сюжет улья говорит вам об этих репозиториях Language github?

 

Вы можете попробовать живую версию на hiveplot.herokuapp.com/index.html и, как всегда, код доступен на github .

Наша визуализация была сделана Rich Morin и Майк Босток с D3.js . Это горячая работа в печати. Вы можете следить за действиями в этой теме группы D3.js google .