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]
还是不行。
你得在Show
和Plot
的命令中同时加入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]
终于我们得到了希望要的图。