Graph[] отсекает метки вершин в Mathematica

Graph[] имеет тенденцию обрезать метки вершин в системе Mathematica. Я ищу надежный обходной путь.

Пример:

Graph[{1 -> 2, 2 -> 3, 3 -> 1}, VertexLabels -> "Name"]

График[] обрезает метку

Мой текущий обходной путь:

SetOptions[Graph, ImagePadding -> 12]

Это ненадежно, потому что значение ImagePadding необходимо корректировать вручную в зависимости от размера метки.


person Szabolcs    schedule 09.05.2011    source источник
comment
У меня нет Mathematica 8. Не могли бы вы попробовать ImagePadding для каждого из: Automatic, Full, All, пожалуйста?   -  person Mr.Wizard    schedule 09.05.2011
comment
По умолчанию Automatic. Full и All дают одинаковый результат.   -  person Szabolcs    schedule 09.05.2011
comment
Хорошо. Я подумал, что стоит попробовать. Кроме того, не думайте, что автоматический режим всегда будет давать тот же результат, что и отсутствие явной настройки; иногда нет!   -  person Mr.Wizard    schedule 09.05.2011
comment
Я вижу в онлайн-справке v8, что для этой цели используется ImagePadding. Я подозреваю, что это означает, что нет простого автоматического способа справиться с этим в целом. Это может быть ошибка или недосмотр. Каков тип вывода Graph? Что вы получите, если сделаете g = Graph[ ... ], а затем g[[1]]?   -  person Mr.Wizard    schedule 09.05.2011
comment
Может ли явный Automatic давать разные результаты, даже если он явно указан в Options[someSymbol]? На самом деле по умолчанию здесь стоит All, я ошибся. Структура Graphobject почти такая же, как и то, что мы вводим в качестве входных данных, приведенное к канонической (?) форме. В данном случае Graph[{1, 2, 3}, {DirectedEdge[1, 2], DirectedEdge[2, 3], DirectedEdge[3, 1]}, {VertexLabels -> {"Name"}}]   -  person Szabolcs    schedule 09.05.2011
comment
Я надеялся, что это объект Graphics. Длинный план здесь, но что произойдет, если вы примените FullGraphics к объекту Graph?   -  person Mr.Wizard    schedule 09.05.2011
comment
(Итак, это структура, которую функция, такая как Part, увидит в Graph, однако из-за некоторых ошибок с Graph я полагаю, что Mathematica внутри использует более низкоуровневое представление.)   -  person Szabolcs    schedule 09.05.2011
comment
@Mr.Wizard, это решает проблему и устраняет интерактивность. (Можно щелкнуть правой кнопкой мыши Graph и выбрать параметры макета и т. д.) Однако я не слишком часто использую интерактивные функции. Видимые этикетки гораздо важнее.   -  person Szabolcs    schedule 09.05.2011
comment
Если это поможет, я опубликую это как ответ, чтобы другие люди могли его найти.   -  person Mr.Wizard    schedule 09.05.2011
comment
Что произойдет, если вы сделаете GraphPlot[ Graph[...] ]?   -  person Mr.Wizard    schedule 09.05.2011
comment
GraphPlot поддерживает Graph в Mma 8. Строит его как обычно (т.е. вывод в стиле GraphPlot, а не интерактивный объект в стиле Graph). Итак, теперь у нас есть 3 разных полу-(в?)-совместимых способа обработки графов... Graph, GraphPlot и GraphUtilities пакет и Combinatorica.   -  person Szabolcs    schedule 09.05.2011
comment
Я был неправ, Graph на самом деле атомарный, Part на нем не работает, а AtomQ возвращает True. См. также stackoverflow.com/questions/4301833/   -  person Szabolcs    schedule 09.05.2011
comment
Звучит далеко не идеально, но что я знаю.   -  person Mr.Wizard    schedule 09.05.2011
comment
Документы для Graph опции VertexLabels довольно часто используют ImagePadding. Для меня это говорит о том, что WRI знает о проблеме, и это официальный обходной путь.   -  person Sjoerd C. de Vries    schedule 09.05.2011
comment
Я сообщил об этом в декабре и получил подтверждение, что это известная ошибка.   -  person Yaroslav Bulatov    schedule 10.05.2011
comment
У меня все еще есть эта проблема в Mathematica 11   -  person Matt G    schedule 14.03.2017


Ответы (2)


По-видимому, использование FullGraphics для объекта Graph исправит отсечение для целей отображения за счет интерактивности.

Согласно комментарию ниже, Show[] также работает и позволяет избежать изменения графики.

person Mr.Wizard    schedule 09.05.2011
comment
Я бы не стал использовать это, поскольку FullGraphics меняет многие аспекты вывода. Попробуйте, например, FullGraphics[ Graph[{1 -> 2, 2 -> 3, 3 -> 1}, VertexLabels -> "Name", PlotLabel -> "This is a test", BaseStyle -> {FontFamily -> "Arial-Bold", FontSize -> 16}]] заменить FullGraphics на Show. - person Sjoerd C. de Vries; 09.05.2011
comment
@Sjoerd, приятно знать. Помимо сжатых сроков, можете ли вы придумать причину, по которой Graph по умолчанию обрезает метки? - person Mr.Wizard; 09.05.2011
comment
Не совсем. Как я отметил в своем комментарии ниже вопроса, кажется, что WRI полностью осознает проблему, поскольку они довольно часто используют обходной путь ImagePadding в разделе документации VertexLabel. - person Sjoerd C. de Vries; 10.05.2011
comment
Граф имеет настройку по умолчанию ImagePadding->All, которая должна означать, что включены все объекты. Я предполагаю, что для текстовых объектов они могут использовать свою точку привязки для определения включения в сюжет, что приводит к ошибкам для больших шрифтов и больших текстов. - person Sjoerd C. de Vries; 10.05.2011

Вот два возможных обходных пути.

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

ex:

Table[Graph[{1 -> 2, 2 -> 3, 3 -> 1}, VertexSize -> 0.3, 
    VertexLabels -> Table[i -> 
       Placed["vertex" <> ToString[i], p], {i, 3}],
    VertexShapeFunction -> "Square", PlotLabel -> p], 
 {p, {Left, Top, Right, Bottom, Center}}]

Используйте всплывающие подсказки для хранения меток вместо их отображения на графике. [Редактировать: Центр, вероятно, выглядит лучше всего, а затем вы можете переносить метки, помещая \n в свою строку, если вам нужно, но опять же, зависит от длины метки.]

ex:

Graph[{1 -> 2, 2 -> 3, 3 -> 1}, VertexLabels -> Placed["Name", Tooltip]]

Хотя это не позволяет вам видеть все метки одновременно, у вас никогда не будет обрезки.

person JeremyKun    schedule 25.05.2011