Почему графика BarChart, экспортированная из Mathematica, имеет пиксельный текст?Есть ли обходной путь? - PullRequest
4 голосов
/ 13 сентября 2011

Я демонстрировал свои новые модные форматы графиков коллегам, но мы обнаружили, что графика на основе BarChart имеет зубчатый текст при экспорте в EMF, WMF, PDF и т. Д. На основе линейных графиков на ListLinePlot, DateListPlot и т. д. такой проблемы нет.

Если не считать Rasterize, то есть каждую Export функцию автоматически (она предназначена для приложения для конечных пользователей, поэтому они сами не должны возиться с ним), есть ли обходной путь? Это удивительно, потому что документация гласит:

Поскольку EMF поддерживает векторную графику, шрифты не растеризуются при экспорте в EMF.

РЕДАКТИРОВАТЬ Если это актуально, используется шрифт Arial. Это должно дать вам что-то очень близкое к графику, за исключением тикгрид-бизнеса, который включает в себя больше пользовательских функций, чем хотелось бы на самом деле пробираться.

SetOptions[BarChart,Background->None, BaseStyle -> {20, FontFamily -> Rfont}, 
Frame -> True,  FrameTicksStyle -> {{Directive[20, 20], 20}, {20, 20}}, 
 FrameStyle -> 
 Directive[AbsoluteThickness[0.9], FontFamily -> Rfont, Black], 
 AspectRatio -> 14./19., PlotRangePadding -> None, Ticks -> None,
 ChartBaseStyle -> EdgeForm[None], GridLinesStyle->Directive[GrayLevel[0.7],  
 AbsoluteThickness[0.9]], GridLines -> {None, Automatic},
 ImageSize -> 672, ImageMargins -> {{0, 0}, {0, 3}}, 
ImagePadding -> {{66, 66}, {All, 1}}
]

SetOptions[ListPlot,Background->None,BaseStyle -> {20, FontFamily -> Rfont,  
 AbsolutePointSize[6]}, Frame -> True, 
 FrameStyle -> Directive[AbsoluteThickness[0.9], FontFamily -> "Arial", Black], 
 FrameTicksStyle -> {{Directive[20, 20], 20}, {20, 20}}, 
 AspectRatio -> 14./19., GridLinesStyle->Directive[GrayLevel[0.7],
 AbsoluteThickness[0.9]], GridLines -> {None, Automatic},PlotRangePadding->None,
  ImageSize -> 672, ImageMargins -> {{0, 0}, {0, 3}}, 
  ImagePadding -> {{66, 66}, {All, 1}}
 ];

areaharvested = {0.25, 1.25, 0.3, -0.1, -0.5, -0.5, -0.5, 0.25, 0.4};
yield = {3.25, 1.1, 2.6, 3., 2., -0.3, 2., 1.5, 1.2};
totalgrainprod = areaharvested + yield;


exgraph = Show[BarChart[Transpose@{areaharvested, yield}, ChartLayout -> "Stacked",
ChartStyle -> {Orange, Green}, PlotRange ->{{8.5, 9.5}, {-1, 4.}},   
 PlotRangePadding -> None,
 FrameTicks ->{{myTickGrid[-1, 4, 1, "%"], myTickGrid[-1, 4, 1, "%"]},
  {myBarChartTicks[{"67-71", "77-81", "87-91", "97-01", "07-11"}, 9], None}}],
ListPlot[totalgrainprod, PlotStyle -> AbsolutePointSize[13]]]    

Export["exgraph.emf", exgraph]

Ответы [ 3 ]

5 голосов
/ 27 сентября 2011

UPDATE

Много лет спустя Вольфрам вернулся с исправлением.

Export[stringtouse, 
     DeleteCases[ obj /. {_Opacity, p_Point} :> 
     {PointSize[0], p}, _Opacity, Infinity], opts]

Я связал это с небольшой вспомогательной функцией, подобной этой.

ExportEMFNicely[pathorfile_String, obj_, opts:OptionsPattern[{Export}]]:=
With[{stringtouse = If[ToLowerCase[StringTake[pathorfile,-4]]===".emf", 
 pathorfile, pathorfile<>".emf"]},
Export[stringtouse, 
 DeleteCases[ obj /. {_Opacity, p_Point} :> 
  {PointSize[0], p}, _Opacity, Infinity], opts] ]

Это создает векторные ЭДС без необходимости Magnify или использования ImageResolution хаков.

ОРИГИНАЛЬНЫЙ ОТВЕТ

Поддержка Wolfram вернулась ко мне. Короткий ответ: это ошибка в Mathematica, и они рекомендуют использовать другой формат или Rasterize

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

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

Rasterize[graphic, ImageResolution-> XXX]

Вы также можете попробовать экспортировать в другие форматы Windows, такие как RTF.

РЕДАКТИРОВАТЬ

С тех пор я понял, что вы можете обойти эту проблему (по крайней мере, в v 8.0.4 и v 9.0.1), используя очень высокое значение для ImageResolution в команде Export.

bc = BarChart[RandomInteger[{1, 20}, {15}], Frame -> True, 
  FrameStyle -> AbsoluteThickness[1], PlotRangePadding -> 0, 
  PlotRange -> {0, 20}, 
  BaseStyle -> {FontFamily -> "Arial", FontSize -> 16}, 
  LabelingFunction -> None]

Export["testbarchart.emf", bc, ImageResolution -> 2000]

Установка ImageResolution на 1300 или выше приводит к тексту в векторном формате и к файлу 50K EMF. Однако, установив его на 1000, растр с высоким разрешением займет 48 Мб! Такое поведение, насколько я знаю, недокументировано. Похоже, что это также создает проблемы с отметками, поскольку они отображаются только в том случае, если вы явно задали их длину, используя более сложный синтаксис для Ticks, FrameTicks и т. Д. (См. документация .)

Одним из предостережений в этом исправлении является то, что Mathematica по-прежнему считает, что для создания этого меньшего векторного файла EMF требуется столько же памяти, сколько для создания растрового изображения высокого разрешения. Так что иногда он будет жаловаться на нехватку памяти, и вам придется выйти из некоторых других приложений. На самом деле не требуется всей этой памяти для создания векторной ЭДС. В моих экспериментах все, что 1300 или выше, будет работать для запуска экспорта вектора, в то время как 1200 и ниже будут генерировать огромное растровое изображение с высоким разрешением.

2 голосов
/ 13 сентября 2011

Я думаю, вы можете найти полезным мой ответ в Toolbag: " Общие проблемы экспорта и решения PDF / EMF. " И этот ответ также очень актуален (попробуйте функцию cyrFix).

0 голосов
/ 13 сентября 2011

Какую версию Mma вы используете?

В версии 8:

a =  BarChart[{1, 2, 3}]
Export["c:\\test.pdf", a]

enter image description here

И увеличение в формате PDF:

enter image description here

...