首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mathematica画图的技巧

Mathematica画图的技巧

作者头像
HuangWeiAI
发布2021-08-24 14:46:41
2.1K0
发布2021-08-24 14:46:41
举报
文章被收录于专栏:浊酒清味浊酒清味

Mathematica是科研的必备神器。但是它自带的画图风格却有点emmmm...

用Mathematica导入和绘制一些数据是很容易的

SetDirectory[NotebookDirectory[]];
data = Import["my_data_file.txt", "Table"];
ListLinePlot[data]

我们从颜色开始。Mathematica有一个科学绘图的颜色包。用下面的命令就可以调出来啦

colors = (("DefaultPlotStyle" /. (Method /. 
       Charting`ResolvePlotTheme["Scientific", ListLinePlot])) /. 
   Directive[x_, __] :> x);

自带的颜色包是下面这样子的

colors = Table[ColorData[97][i], {i, 1, 15}]

默认的字体太小了

我们得调大一点

plt = Plot[{Sin[x], Cos[x]}, {x, 0, 2*Pi}, PlotLabel -> "Plots"]

用BaseStyle可以在各个地方都调整大小

plt = Plot[{Sin[x], Cos[x]}, {x, 0, 2*Pi}, PlotLabel -> "Plots", BaseStyle -> {FontSize -> 24}]

我们来看看Legend怎么样

colors = (("DefaultPlotStyle" /. (Method /. 
        Charting`ResolvePlotTheme["Scientific", ListLinePlot])) /. 
    Directive[x_, __] :> x);
leg = LineLegend[colors[[;; 2]], {"Sin", "Cos"}];
p1 = Plot[{Sin[x], Cos[x]}, {x, 0, 2*Pi}, PlotLegends -> leg]

太小了这,调大点LabelStyle -> Directive[FontSize -> 24] LegendMarkerSize -> 40

colors = (("DefaultPlotStyle" /. (Method /. 
        Charting`ResolvePlotTheme["Scientific", ListLinePlot])) /. 
    Directive[x_, __] :> x);
leg = LineLegend[colors[[;; 2]], {"Sin", "Cos"}, 
   LabelStyle -> Directive[FontSize -> 24], LegendMarkerSize -> 40];
p2 = Plot[{Sin[x], Cos[x]}, {x, 0, 2*Pi}, PlotLegends -> leg, 
  ImageSize -> 400]

我们再来看一下mathematica的color function。首先我们生成一个除了(1,1)是10000,其他元素都在[0,1]的矩阵

m = RandomReal[{0, 1}, {10, 10}];
m[[1, 1]] = 10000;
Plotting the matrix gives:
pltM1 = MatrixPlot[m, PlotLegends -> Automatic]

我们发现右边的legend完全错了。

pltM2 = MatrixPlot[m, PlotRange -> All, PlotLegends -> Automatic]
Ugh. The correct fix is to create the legend manually:
leg = BarLegend[{"BlueGreenYellow", {0, 1}}, 
   LabelStyle -> Directive[FontSize -> 24]];

但这不够,你还需要改变color scaling

leg = BarLegend[{"BlueGreenYellow", {0, 1}}, 
   LabelStyle -> Directive[FontSize -> 24]];
pltM3 = MatrixPlot[m, PlotRange -> All, PlotLegends -> leg, 
  ColorFunction -> (ColorData[{"BlueGreenYellow", {0, 1}}]),
  ColorFunctionScaling -> False]

现在就生成了正确的图。

接下来我们来看看如何对图进行输出

plt = ListLinePlot[RandomReal[{0, 1}, 100]]

标准的命令是

SetDirectory[NotebookDirectory[]];
Export["plt.pdf", plt];

这里要注意的点是你得注明输出的路径,否则你就找不到了。另外,如果输出的是png格式,你得注明图片的分辨率

Export["plt.png", plt, ImageResolution -> 200]

如果你想输出两列横着排列的图,下面的代码在nb文件里面显示是没问题的。

colors = (("DefaultPlotStyle" /. (Method /. 
        Charting`ResolvePlotTheme["Scientific", ListLinePlot])) /. 
    Directive[x_, __] :> x);
plt1 = Plot[Sin[x], {x, 0, 2*Pi}];
plt2 = Plot[Cos[x], {x, 0, 2*Pi}, PlotStyle -> colors[[2]]];
pltRow = Row[{plt1, plt2}]

但输出就有问题了

SetDirectory[NotebookDirectory[]];
Export["plt_row.png", pltRow, ImageResolution -> 200];

正确做法是:总是使用Grid

pltGrid = Grid[{{plt1, plt2}}]

如果你想把很多图放到一张图上,你可以使用show命令

p1 = ListLinePlot[RandomReal[{0, 1}, 100]];
p2 = Graphics[{Blue, Opacity[0.1], Rectangle[{20, 0}, {60, 1}]}];
pShow = Show[p1, p2]

但这样的做法的plotrange默认是使用的第一个图的plotrange

p1 = Plot[Sin[x/5], {x, 0, 100}];
data = RandomReal[{-1, 1}, 100];
data[[95 ;;]] += 100;
p2 = ListLinePlot[data, PlotStyle -> {Blue, Dashed}];
pShow = Show[p1, p2]

如果我们想显示最大的range。在show上面加上PlotRange->All呢?

p1 = Plot[Sin[x/5], {x, 0, 100}];
data = RandomReal[{-1, 1}, 100];
data[[95 ;;]] += 100;
p2 = ListLinePlot[data, PlotStyle -> {Blue, Dashed}];
pShow = Show[p1, p2, PlotRange -> All]

还是不行。

你得在ShowPlot的命令中同时加入PlotRange->All

p1 = Plot[Sin[x/5], {x, 0, 100}];
data = RandomReal[{-1, 1}, 100];
data[[95 ;;]] += 100;
p2 = ListLinePlot[data, PlotStyle -> {Blue, Dashed}, PlotRange -> All];
pShow = Show[p1, p2, PlotRange -> All]

终于我们得到了希望要的图。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python学会 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档