相关疑难解决方法(0)

保存绘图注释

昨天,同时加入一些时间地块的"从每个列表最理想选择一个元素"的问题,我再一次想起了mathgroup发布我几年前做的("再生一个情节后保持情节注释").

当我认为某些轴标签会很好时,我很高兴地(手动)注释我的情节.问题是,使用轴标签重新生成图将会破坏您的手动注释.

看起来您可以在名为pic的图中找到用户添加内容:Rest[pic[[1, 1]]],因此,如果您将图重新生成为pic2,则可以使用以下内容获取注释:

Insert[pic2, Rest[pic[[1, 1]]], {1, 1}]
Run Code Online (Sandbox Code Playgroud)

我记得David Park(演示文稿包的作者)强烈反对手动注释.我自己做了一些程序化标签,但有时候在程序控制下放置标签太难了,就像这里一样(注意我不太喜欢PlotLegends,特别是因为有些颜色彼此接近):

顶级的回答者

扔掉原点的原因已经太晚了,但我不知道目前对这个问题的看法是什么.

  • 有没有更好的方法来做到这一点?
  • 这种方法有多普遍?它适用于所有绘图和图表类型吗?
  • 它适用于所有版本吗?(5.2以上)
  • 任何WRI计划改善地块中用户添加的处理?

BTW我的数学组发布中的技巧与上面显示的技巧略有不同,并且在前10个图中使用.但原则是一样的.


编辑

我将代码放置在Mathematica Toolbag中制作如上所示的SO数据图.

编辑

现在代码被Brett Champion转移到更合适的问题:如何从Mathematica访问StackOverflow API

wolfram-mathematica

10
推荐指数
2
解决办法
807
查看次数

用`FullForm`语法保存Mathematica代码

我需要在一个大的Mathematica代码库(数十万行代码)上做一些元编程,并且不想编写一个完整的解析器,所以我想知道如何最好地从Mathematica笔记本中获取代码用一种易于解析的语法.

是否可以在FullForm语法中导出Mathematica笔记本,或者在语法中保存所有定义FullForm

文档Save说,它可以在唯一的出口InputForm语法,这是不平凡的解析.

到目前为止,我所拥有的最佳解决方案是评估笔记本,然后使用DownValues参数提取重写规则(但这会错过符号定义),如下所示:

DVs[_] := {}
DVs[s_Symbol] := DownValues[s]
stream = OpenWrite["FullForm.m"];
WriteString[stream, 
  DVs[Symbol[#]] & /@ Names["Global`*"] // Flatten // FullForm];
Close[stream];
Run Code Online (Sandbox Code Playgroud)

到目前为止,我尝试了各种方法,但没有一种方法效果很好.Mathematica中的元编程似乎非常困难,因为它一直在评估我想要保持不被评估的事物.例如,我想获取无穷大符号的字符串名称,SymbolName[Infinity]但是将Infinity得到的值计算为非符号,并且调用SymbolName带有错误的die.因此,我希望用更合适的语言进行元编程.

编辑

最好的解决方案似乎是手动将笔记本保存为包(.m)文件,然后使用以下代码进行翻译:

stream = OpenWrite["EverythingFullForm.m"];
WriteString[stream, Import["Everything.m", "HeldExpressions"] // FullForm];
Close[stream];
Run Code Online (Sandbox Code Playgroud)

syntax parsing wolfram-mathematica metaprogramming

7
推荐指数
2
解决办法
1071
查看次数

在不评估保持表达式的情况下从列表中删除空列表的有效方法?

以前的线程的有效方式删除空列表({}从列表)建议:

Replace[expr, x_List :> DeleteCases[x, {}], {0, Infinity}]
Run Code Online (Sandbox Code Playgroud)

使用Trott-Strzebonski就地评估技术,这种方法可以推广用于同时使用保持的表达式:

f1[expr_] := 
 Replace[expr, 
  x_List :> With[{eval = DeleteCases[x, {}]}, eval /; True], {0, Infinity}]
Run Code Online (Sandbox Code Playgroud)

此解决方案比基于以下方案的解决方案更有效ReplaceRepeated:

f2[expr_] := expr //. {left___, {}, right___} :> {left, right}
Run Code Online (Sandbox Code Playgroud)

但它有一个缺点:如果它们被包装,它会对持有的表达式进行求值List:

In[20]:= f1[Hold[{{}, 1 + 1}]]

Out[20]= Hold[{2}]
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:在{}不评估保持表达式的情况下从列表中删除所有空列表()的最有效方法是什么?只有当它是另一个自身的元素时,List[]应删除空对象.List


以下是一些时间安排:

In[76]:= expr = Tuples[Tuples[{{}, {}}, 3], 4];
First@Timing[#[expr]] & /@ {f1, f2, f3}
pl = Plot3D[Sin[x y], {x, …
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica

6
推荐指数
1
解决办法
1151
查看次数