Новый график в Mathematica 8.0

  1. Кто-нибудь нашел способ изменить объекты Graph в Mathematica 8? В частности, как получить ту же функциональность, которую вы получаете, щелкая правой кнопкой мыши на графике.

  2. Некоторые из новых функций графа конфликтуют с CombinatoricaЕсть ли способ заставить Mathematica использовать встроенную версию функции? Другими словами, есть ли способ получить доступ к встроенным CompleteGraph после того, как я Needs["Combinatorica"] которая импортирует Combinatorica версию CompleteGraph?

Для пояснения 1, контекстное меню на графике позволяет вам изменять GraphStyle и GraphLayout, и я хотел бы иметь возможность изменять их программно. Вот один способ, которым я нашел, чтобы изменить GraphStyle объекта Graph

g = GridGraph[{4, 4}];
BooleanGraph[Or, g, g, GraphStyle -> "DiagramBlack"]

Тем не менее, это забывает параметры исходного графика, как VertexCoordinates

Испытание рецепта Бретта на графике сетки

g = GridGraph[{3, 2}, ImageSize -> Tiny]
coords = PropertyValue[{g, #}, VertexCoordinates] & /@ VertexList[g];
Graph[EdgeList[g], GraphStyle -> "BasicGold", 
 VertexCoordinates -> coords, ImageSize -> Tiny]

http://yaroslavvb.com/upload/save/mathematica-change-style.png

Кажется, есть ошибка в том, как Mathematica обрабатывает координаты графа в операциях графа. Первая строка ниже переставляет координаты, вторая выдает внутреннее предупреждение, вероятно, связанное с координатами. Использование нецелых вершин и явных координат для каждой вершины не помогает. Одним из решений является хранение координат по всему миру и fixCoordinates функция переназначения правильных координат Graph после изменений

VertexDelete[GridGraph[{3, 3}], 1]
NeighborhoodGraph[VertexDelete[GridGraph[{3, 3}], 1], 2]

3 ответа

Решение

Новые объекты Graph являются атомарными в Mathematica 8. Таким образом, подобно строкам или изображениям, они не имеют внутренней структуры, которой можно манипулировать обычным способом. Что особенно необычно, так это то, что новые объекты имеют FullForm, который выглядит так, будто им можно манипулировать символически. Но внешний вид может быть обманчивым - это не только то, что представление недоступно для сопоставления с образцом, но это даже не допустимая спецификация графа, если вы передаете его обратно в Mathematica с помощью функции копирования и вставки.

Я нашел пару хаков, которые можно использовать для манипулирования структурой графа. Первый пытается использовать "официальные" каналы для извлечения свойств графиков:

adjustedGraph[g_, newOptions___] :=
  Graph[
    VertexList@g,
    EdgeList@g,
    newOptions,
    Sequence@@Table[p -> PropertyValue[g, p], {p, PropertyList[g]}]
  ]

Вы можете использовать эту функцию следующим образом:

g = GridGraph[{4, 4}, GraphStyle -> "DiagramBlack", ImageSize -> Tiny]
adjustedGraph[g, GraphStyle -> "BasicGold"]

Эта функция использует VertexList, EdgeList и PropertyValue для извлечения свойств графика. К сожалению, некоторые варианты не восстанавливаются этим способом. Например, опция Graphics ImageSize будет потеряна при использовании этого метода.

Еще более отвратительный хак использует псевдосимвольное представление FullForm:

adjustedGraph2[g_, newOptions___] :=
  "Hold@" ~~ ToString[g, InputForm] //
  ToExpression //
  #[[1, 3]] & //
  Graph[VertexList@g, EdgeList@g, newOptions, Sequence @@ #] &

Несмотря на свою злую природу, эта вторая функция работает более удовлетворительно, поскольку, похоже, сохраняет большинство параметров графика. Я говорю "большинство", потому что я еще не экспериментировал с более эзотерическими опциями, такими как обертки, функции формы и свойства графика, назначенные после факта. Нет никаких гарантий, что этот метод будет работать без изменений, поскольку Wolfram изменяет представление объектов графа (или даже то, что он работает для всех возможных определений графа сейчас).

Должен быть способ достичь этого без взломов. Я все еще сохраняю надежду, что есть какая-то функция, которая даст полное символическое представление объекта графа.

Что касается конфликтов символов, возникающих после загрузки пакета Combinatorica, вы все равно можете получить доступ к исходным символам, явно указав имя пакета, например, System`CompleteGraph. Если вы предпочитаете, чтобы системные символы имели приоритет над символами Combinatorica, вы можете оценить следующее выражение, чтобы изменить порядок поиска пакетов:

$ContextPath =
  $ContextPath /.
    {x___, c : "Combinatorica`", y___, s:"System`", z___} :> {x, y, s, c, z}

Я отмечаю, что Wolfram эффективно осуждает пакет Combinatorica, выдавая страшное предупреждающее сообщение при загрузке пакета.

Следующее сохранит координаты вершины исходного графа.

g = CompleteGraph[5];
coords = PropertyValue[{g, #}, VertexCoordinates] & /@ VertexList[g];
Graph[VertexList[g], EdgeList[g], GraphStyle -> "BasicGold", 
 VertexCoordinates -> coords]

Mathematica графика

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

Для #2 вы должны быть в состоянии использовать различение между двумя, используя контекст. Таким образом, System`CompleteGraph[5] создает новый график V8, в то время как Combinatorica`CompleteGraph[5] создает старый граф Combinatorica.

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

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