Ver*_*eia 4 wolfram-mathematica bar-chart
我一直在炫耀我看中新的图形格式的同事,但我们发现,基于图形BarChart当线图基础为EMF,WMF,PDF等出口有锯齿的文本ListLinePlot,DateListPlot等不存在这个问题.
短的Rasterize-ing每一个Export自动功能(这是针对最终用户的应用程序,使他们不能指望用它自己捣鼓),有没有解决办法?这是一个惊喜,因为文档说:
由于EMF支持矢量图形,因此在导出到EMF时不会对字体进行栅格化.
编辑如果相关,使用的字体是Arial.这应该给你一些非常接近图表的东西,除了tickgrid业务,它涉及更多的自定义功能,而不是真正想要通过的.
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]
Run Code Online (Sandbox Code Playgroud)
UPDATE
许多年后,Wolfram回来了.
Export[stringtouse,
DeleteCases[ obj /. {_Opacity, p_Point} :>
{PointSize[0], p}, _Opacity, Infinity], opts]
Run Code Online (Sandbox Code Playgroud)
我把它绑定到像这样的小辅助函数中.
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] ]
Run Code Online (Sandbox Code Playgroud)
这样就可以生成矢量EMF,而无需Magnify使用或使用ImageResolution黑客攻击.
原始答案
Wolfram的支持回到了我的身边.简短的回答是它是Mathematica中的一个错误,他们建议使用其他格式或Rasterize
谢谢您的来信.过去已经报道过与Mathematica出口图像质量有关的问题,我们的开发人员正在研究这些问题.不过,我代表您提交了一份单独的报告.我还提供了您的联系信息,以便在解决此问题时通知您.
与此同时,您可以尝试的另一个选项是在导出到EMF之前使用适当的分辨率栅格化图形.
Rasterize[graphic, ImageResolution-> XXX]您也可以尝试导出到其他Windows格式,如RTF.
编辑
我已经解决了你可以ImageResolution在Export命令中使用非常高的值来解决这个问题(至少在v 8.0.4和v 9.0.1中) .
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]
Run Code Online (Sandbox Code Playgroud)
设置ImageResolution为1300或更高会生成矢量格式文本和50k EMF文件.但是将其设置为1000会导致高分辨率光栅占用48 Mb!据我所知,这种行为没有记录.这似乎也创建刻度线的问题,因为它们只能说明,如果你明确使用更复杂的语法来设定它们的长度Ticks,FrameTicks等等(见文档.)
对此修复的一个警告是,Mathematica仍然认为它需要尽可能多的内存来创建这个较小的,基于矢量的EMF文件,因为它将创建高分辨率位图.所以它有时会抱怨没有足够的内存,你需要退出其他一些应用程序.它实际上并不需要所有内存来创建矢量EMF.在我的实验中,1300或以上的任何东西都可以触发向量导出,而1200及以下将生成高分辨率,巨大的位图.
| 归档时间: |
|
| 查看次数: |
1164 次 |
| 最近记录: |