Mathematica:3D图形中的栅格

如何解决Mathematica:3D图形中的栅格

| 有时候,导出到pdf图像会很麻烦。如果您要绘制的数据包含许多点,则您的图形将很大,并且您选择的pdf查看器将花费大部分时间来渲染此高质量图像。因此,我们可以将此图像导出为jpeg,png或tiff。从特定的角度看,图片会很好,但是放大时看起来会失真。这对于我们正在绘制的图形在某种程度上是可以的,但是如果您的图像包含文本,则该文本将看起来像是像素化的。 为了尽力做到两全其美,我们可以将此图分为两部分:带标签的轴和3D图片。因此,可以将轴导出为pdf或eps,将3D图形导出为栅格。我希望我知道以后如何在Mathematica中将两者结合起来,因此目前我们可以使用矢量图形编辑器(例如Inkscape或Illustrator)来结合两者。 我设法通过在出版物中绘制的图实现了这一点,但这促使我在Mathematica中创建例程以使该过程自动化。这是我到目前为止的内容:
SetDirectory[NotebookDirectory[]];
SetOptions[$FrontEnd,PrintingStyleEnvironment -> \"Working\"];
我喜欢通过将工作目录设置为Notebook目录来启动我的笔记本。由于我希望图像具有我指定的尺寸,因此我将打印样式环境设置为可以正常工作,请检查此以获得更多信息。
in = 72;
G3D = Graphics3D[
  AlignmentPoint -> Center,AspectRatio -> 0.925,Axes -> {True,True,True},AxesEdge -> {{-1,-1},{1,{-1,-1}},AxesStyle -> Directive[10,Black],BaseStyle -> {FontFamily -> \"Arial\",FontSize -> 12},Boxed -> False,BoxRatios -> {3,3,1},LabelStyle -> Directive[Black],ImagePadding -> All,ImageSize -> 5 in,PlotRange -> All,PlotRangePadding -> None,TicksStyle -> Directive[10],ViewPoint -> {2,-2,2},ViewVertical -> {0,1}
 ]
在这里,我们设置要绘制的图的视图。现在让我们创建情节。
g = Show[
  Plot3D[Sin[x y],{x,Pi},{y,Mesh -> None,AxesLabel -> {\"x\",\"y\",\"z\"}
   ],Options[G3D]
 ]
现在我们需要找到一种分离的方法。让我们从绘制轴开始。
axes = Graphics3D[{},AbsoluteOptions[g]]
fig = Show[g,AxesStyle -> Directive[Opacity[0]],FaceGrids -> {{-1,0},{0,1,0}}
 ]
我包括了facegrids,以便我们可以在后期编辑过程中将图形与轴匹配。现在我们导出两个图像。
Export[\"Axes.pdf\",axes];
Export[\"Fig.pdf\",Rasterize[fig,ImageResolution -> 300]];
您将获得两个pdf文件,您可以对其进行编辑并将它们放在一起成为pdf或eps。我希望它是如此简单,但事实并非如此。如果您确实这样做了,您将获得以下信息: 这两个数字是不同的大小。我知道axes.pdf是正确的,因为当我在Inkspace中打开它时,图形尺寸为5英寸,正如我之前指定的那样。 我之前提到过,我设法在其中的一块地块上做到了这一点。我将清理该文件并更改其图,以使任何希望看到这确实是事实的人都可以访问它。无论如何,有人知道我为什么不能使两个pdf文件大小相同吗?另外,请记住,我们要获得栅格化图形的漂亮图。感谢您的时间。 PS。 另外,我们是否可以避免后期编辑,而只需在mathematica中简单地将两个图形组合起来?光栅化版本和矢量图形版本。 编辑: 感谢rcollyer的评论。我正在发布他的评论结果。 要提到的一件事是,当我们导出轴时,我们需要将
Background
设置为
None
,以便获得透明的图片。
Export[\"Axes.pdf\",axes,Background -> None];
Export[\"Fig.pdf\",ImageResolution -> 300]];
a = Import[\"Axes.pdf\"];
b = Import[\"Fig.pdf\"];
Show[b,a]
然后,导出图形将达到预期的效果
Export[\"FinalFig.pdf\",Show[b,a]]
轴保留了矢量图形的精美组件,而该图现在是我们绘制图形的光栅化版本。但是主要问题仍然存在。 您如何使两个数字匹配? 更新: 阿列克谢·波普科夫(Alexey Popkov)回答了我的问题。我感谢他花时间研究我的问题。以下代码是您想要使用我之前提到的技术的示例。请在他的代码中查看Alexey Popkov的答案以获取有用的注释。他设法使其可以在Mathematica 7中运行,并且在Mathematica 8中甚至可以更好地运行。结果如下:
SetDirectory[NotebookDirectory[]];
SetOptions[$FrontEnd,PrintingStyleEnvironment -> \"Working\"];
$HistoryLength = 0;
in = 72;
G3D = Graphics3D[
 AlignmentPoint -> Center,ImagePadding -> 40,PlotRangePadding -> 0,1}
];
axesLabels = Graphics3D[{
 Text[Style[\"x axis (units)\",Black,12],Scaled[{.5,-.1,0}],-.9}],Text[Style[\"y axis (units)\",Scaled[{1.1,.5,.9}],Text[Style[\"z axis (units)\",Scaled[{0,-.15,.7}],{-.1,1.5}]
}];
fig = Show[
  Plot3D[Sin[x y],Mesh -> None],ImagePadding -> {{40,{15,0}},Options[G3D]
];
axes = Show[
  Graphics3D[{},AbsoluteOptions[fig]],axesLabels,Epilog -> Text[Style[\"Panel A\",Bold,ImageScaled[{0.075,0.975}]]
];
fig = Show[fig,AxesStyle -> Directive[Opacity[0]]];
Row[{fig,axes}]
此时,您应该看到以下内容: 放大倍数会影响图像的分辨率。您应该尝试不同的值,以了解这如何改变您的图片。
fig = Magnify[fig,5];
fig = Rasterize[fig,Background -> None];
合并图形
axes = First@ImportString[ExportString[axes,\"PDF\"],\"PDF\"];
result = Show[axes,Epilog -> Inset[fig,ImageDimensions[axes]]];
导出它们
Export[\"Result.pdf\",result];
Export[\"Result.eps\",result];
使用上面的代码,我发现M7和M8之间的唯一区别是M7无法正确导出eps文件。除此之外,现在一切正常。 :) 第一列显示了从M7获得的输出。顶部是eps版本,文件大小为614 kb,底部是pdf版本,文件大小为455 kb。第二列显示从M8获得的输出。顶部是eps版本,文件大小为643 kb,底部是pdf版本,文件大小为463 kb。 希望这个对你有帮助。请检查Alexey的答案以查看他的代码中的注释,它们将帮助您避免Mathematica带来的陷阱。     

解决方法

Mathematica 7.0.1的完整解决方案:修复错误 带有注释的代码:
(*controls the resolution of rasterized graphics*)
magnification = 5;

SetOptions[$FrontEnd,PrintingStyleEnvironment -> \"Working\"]
(*Turn off history for saving memory*)
$HistoryLength = 0;
(*Epilog will give us the bounding box of the graphics*)
g1 = Plot3D[Sin[x y],{x,Pi},{y,AlignmentPoint -> Center,AspectRatio -> 0.925,Axes -> {True,True,True},AxesEdge -> {{-1,-1},{1,{-1,-1}},BaseStyle -> {FontFamily -> \"Arial\",FontSize -> 12},Boxed -> False,BoxRatios -> {3,3,1},LabelStyle -> Directive[Black],ImagePadding -> All,ImageSize -> 5*72,PlotRange -> All,PlotRangePadding -> None,TicksStyle -> Directive[10],ViewPoint -> {2,-2,2},ViewVertical -> {0,AxesStyle -> Directive[Opacity[0]],FaceGrids -> {{-1,0},{0,1,0}},Mesh -> None,ImagePadding -> 40,Epilog -> {Red,AbsoluteThickness[1],Line[{ImageScaled[{0,0}],ImageScaled[{0,1}],ImageScaled[{1,0}]}]}];
(*The options list should NOT contain ImagePadding->Full.Even it is \\
before ImagePadding->40 it is not replaced by the latter-another bug!*)
axes = Graphics3D[{Opacity[0],Point[PlotRange /. AbsoluteOptions[g1] // Transpose]},AxesStyle -> Directive[10,Black],0}]}]}];
(*fixing bug with ImagePadding loosed when specifyed as option in \\
Plot3D*)
g1 = AppendTo[g1,ImagePadding -> 40];
(*Increasing ImageSize without damage.Explicit setting for \\
ImagePadding is important (due to a bug in behavior of \\
ImagePadding->Full)!*)
g1 = Magnify[g1,magnification];
g2 = Rasterize[g1,Background -> None];
(*Fixing bug with non-working option Background->None when graphics \\
is Magnifyed*)
g2 = g2 /. {255,255,255} -> {0,0};
(*Fixing bug with icorrect exporting of Ticks in PDF when Graphics3D \\
and 2D Raster are combined*)
axes = First@ImportString[ExportString[axes,\"PDF\"],\"PDF\"];
(*Getting explicid ImageSize of graphics imported form PDF*)
imageSize = 
 Last@Transpose[{First@#,Last@#} & /@ 
    Sort /@ Transpose@
      First@Cases[axes,Style[{Line[x_]},___,RGBColor[1.`,0.`,1.`],___] :> 
         x,Infinity]]
(*combining Graphics3D and Graphics*)
result = Show[axes,Epilog -> Inset[g2,imageSize]]
Export[\"C:\\\\result.pdf\",result]
这是我在笔记本中看到的内容: 这是我从PDF中获得的内容:     ,        只需检查(Mma8):
SetOptions[$FrontEnd,PrintingStyleEnvironment -> \"Working\"];
in = 72;
G3D = Graphics3D[AlignmentPoint -> Center,ImageSize -> 5 in,1}];
g = Show[Plot3D[Sin[x y],AxesLabel -> {\"x\",\"y\",\"z\"}],Options[G3D]];
axes = Graphics3D[{},AbsoluteOptions[g]];
fig = Show[g,0}}];
Export[\"c:\\\\Axes.pdf\",axes,Background -> None];
Export[\"c:\\\\Fig.pdf\",Rasterize[fig,ImageResolution -> 300]];
a = Import[\"c:\\\\Axes.pdf\"];
b = Import[\"c:\\\\Fig.pdf\"];
Export[\"c:\\\\FinalFig.pdf\",Show[b,a]]
    ,        在Mathematica 8中,使用新的
Overlay
函数可以更简单地解决问题。 这是问题的UPDATE部分中的代码:
SetOptions[$FrontEnd,PrintingStyleEnvironment -> \"Working\"];
$HistoryLength = 0;
in = 72;
G3D = Graphics3D[AlignmentPoint -> Center,PlotRangePadding -> 0,1}];
axesLabels = 
  Graphics3D[{Text[Style[\"x axis (units)\",Black,12],Scaled[{.5,-.1,-.9}],Text[Style[\"y axis (units)\",Scaled[{1.1,.5,.9}],Text[Style[\"z axis (units)\",Scaled[{0,-.15,.7}],{-.1,1.5}]}];
fig = Show[Plot3D[Sin[x y],Mesh -> None],ImagePadding -> {{40,{15,Options[G3D]];
axes = Show[
   Graphics3D[{},AbsoluteOptions[fig]],axesLabels,Epilog -> 
    Text[Style[\"Panel A\",Bold,ImageScaled[{0.075,0.975}]]];
fig = Show[fig,AxesStyle -> Directive[Opacity[0]]];
这是解决方案:
gr = Overlay[{axes,Background -> None,ImageResolution -> 300]}]
Export[\"Result.pdf\",gr]
在这种情况下,我们不需要将字体转换为轮廓。 更新 正如jmlopez在对此答案的注释中指出的那样,选项
Background -> None
在Mathematica 8.0.1的Mac OS X下无法正常工作。一种解决方法是将白色非透明点替换为透明点:
gr = Overlay[{axes,ImageResolution -> 300] /. {255,0}}]
Export[\"Result.pdf\",gr]
    ,        在这里,我介绍原始解决方案的另一个版本,该版本使用uses21ѭ而不是
Inset
的第二个参数。我认为这种方式更加简单。 这是问题的UPDATE部分中的代码(稍作修改):
SetOptions[$FrontEnd,Prolog -> 
    Text[Style[\"Panel A\",AxesStyle -> Directive[Opacity[0]]];
fig = Magnify[fig,5];
fig = Rasterize[fig,Background -> None];
axes2D = First@ImportString[ExportString[axes,\"PDF\"];
剩下的答案就是新的解决方案。 首先,我们设置第二个参数
Raster
,以使其充满fill26ѭ的完整
PlotRange
。这样做的一般方法是:
fig = fig /. 
   Raster[data_,rectangle_,opts___] :> 
    Raster[data,{Scaled[{0,Scaled[{1,1}]},opts];
另一种方法是直接分配原始表达式的对应
Part
fig[[1,2]] = {Scaled[{0,1}]}
注意,最后一个代码基于对由the30ѭ生成的表达式的内部结构的了解,这可能与版本有关。 现在,我们以非常简单的方式组合了两个图形对象:
result = Show[axes2D,fig]
并导出结果:
Export[\"C:/Result.pdf\",result];
Export[\"C:/Result.eps\",result];
.eps和.pdf都可以在Windows XP 32位下使用Mathematica 8.0.4完美导出,并且看起来与使用原始代码导出的文件完全相同:
result = Show[axes2D,Epilog -> Inset[fig,Center,1}]]]
Export[\"C:/Result.pdf\",result];
注意,至少在导出为PDF时,我们不一定需要将“ 34”转换为轮廓。代码
result = Show[axes,result];
和代码
fig[[1,2]] = {ImageScaled[{0,1}]};
result = Show[axes,Epilog -> First@fig]
Export[\"C:/Result.pdf\",result];
生成与两个先前版本相同的PDF文件。     ,        这看起来似乎很无聊。在我阅读本文时,您要解决的问题如下: 您想以矢量格式导出,以便在打印时将最佳分辨率用于字体,线条和图形 在您的编辑程序中,您不想被渲染复杂的矢量图形的速度所困扰 通过导出为.eps并使用嵌入式栅格化预览图像可以满足这些要求。
Export[\"file.eps\",\"PreviewFormat\"->\"TIFF\"]
这将在许多应用程序中工作。不幸的是,MS Word的eps过滤器在过去四个左右的版本中已经发生了巨大变化,而它曾经在较旧的功能之一中对我有用,但在W2010中不再可用。我听说有传言说它可能在Mac版本中可以运行,但是我现在无法检查。     ,        Mathematica 9.0.1.0 / 64位Linux: 通常,将矢量化轴放置在正确位置似乎非常棘手。在大多数应用程序中,只需简单地以高分辨率光栅化所有内容就足够了:
fig = Plot3D[Sin[x y],3},Mesh -> None];

Export[\"export.eps\",fig,\"AllowRasterization\" -> True,ImageResolution -> 600];
该代码使用3D内容和轴的高质量光栅化将图形导出到EPS文件。最后,您可以使用例如Linux命令epspdf将EPS文件转换为PDF:
epspdf export.eps
这对于大多数用户而言可能已经足够,并且可以节省大量时间。但是,如果您确实希望将文本导出为矢量图形,则可能需要尝试以下功能:
ExportAsSemiRaster[filename_,dpi_,fig_,plotrange_,plotrangepadding_] := (
   range = 
    Show[fig,PlotRange -> plotrange,PlotRangePadding -> plotrangepadding];
   axes = Show[Graphics3D[{},AbsoluteOptions[range]]];
   noaxes = Show[range,AxesStyle -> Transparent];
   raster = 
    Rasterize[noaxes,ImageResolution -> dpi];
   result = 
    Show[raster,Epilog -> Inset[axes,ImageDimensions[raster]]];
   Export[filename,result];
   );
您需要显式指定PlotRange和PlotRangePadding。例:
fig = Graphics3D[{Opacity[0.9],Orange,Polygon[{{0,{4,4},5,7},5}}],Opacity[0.05],Gray,CuboidBox[{0,7}]},Axes -> True,AxesStyle -> Darker[Orange],AxesLabel -> {\"x1\",\"x2\",\"x3\"},ViewPoint -> {-8.5,-8,6}];
ExportAsSemiRaster[\"export.pdf\",600,{{0,5},7}},{.0,.0,.0}];
Print[Import[\"export.pdf\"]];
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res