如何美化MATLAB和Python画出来的图
写在前面
俗话有句叫做:字不如表,表不如图,意思就是图可以最直观最显然的表达我们想要表达的信息,其升降趋势一目了然;表其次,能够看到数值,但是想要看出变化趋势却很困难(完全不可能看出一个复杂的周期性变化);最次的是文字表达,可以用文字来表达其趋势、周期、大小范围,但是终究没有具体的数值与更显然、更直观的图来的好。
话虽如此,在作图方面,一个好看的图能够吸引读者的目光,甚至叹之妙绝——“明明一样的数据,我怎么做不出来这么好看的图”;一个难看简陋的图搁谁都不想看第二眼,更何况从中分析出什么数据了。
所以我这里想要给大家分享的就是在做数模的几年里,以及近期在实验室搬砖并阅读大量文献后的,一些对作图上的想法。
为了照顾到采用不同的可视化软件的人,这篇文章将分成两个部分,一个是MATLAB,另一个是Python。这两个部分的差别仅在于调用函数、代码指令的细微差别,比如说调整坐标轴粗细,MATLAB用set(gca, 'linewidth', 1.1)而Python却用ax.spines['bottom'].set_linewidth(2)这样的差别。
具体我们画好以后的图,就以这个图作为参考。
例子如何画好一个图?
反面教材
我们首先来看两个反面教材,这两个反面教材是我随便搜“MATLAB作图”后找到的博客或PPT上面截下来的,可以理解他们本意是仅仅教授怎么做图,并不负责怎么做好看。但是其不认真的态度还是让我来做反面教材了,因为他们竟然是“直接截图!不是保存图像!把MATLAB的大灰边截下来了!!”
反面教材1首先对于反面教材1,夸张的线宽、耀眼的蓝色线条绿色底色,明显的夕阳红配色。
反面教材2然后反面教材2,加个网格说明别出心裁,但是字体很难看,并且截图就截图吧露个大灰边,还没把截全。
如何避免出现以上这种情况?
最主要的一步:
不要截图!!请点左上角“Save/保存”!!这样子出来的图就是白色底了,而不是预览的灰色底。
其次,我们在作图是一定要严格按照以下几点来规范自身:
- 线宽合适,默认的太细,最好是1.1;
- 字体调大,默认的太小,最好是16;
- 散点内部填充颜色要好看,不要刺眼,要手动调RGB值设置颜色;
- 坐标轴边框也太细,一定要加粗到1.1;
- 一定要加上横纵坐标描述;
- 显示出坐标轴范围要留出空隙,不要让图像紧靠边框,且上下左右空隙相等。
下面我将详细进行描述。
对于MATLAB的作图细节
首先我们已经有了几组数据
x = linspace(0, 3*pi, 40);
y1 = sin(x);
y2 = 0.1*x-0.5;
直接画出来是如下图所示,所有颜色、线宽都是默认的。看上去也还行,但是未免也太“空荡”、“简陋”了,缺少设计感。
最基础的默认图像所以,下面我就直接说明怎么修改了:
对于线条部分
加粗线条宽度到1.1,线条颜色为黑色(切记),加上散点,散点内部填充颜色。所以加上一下代码:
plot(x, y1, 'ok-', 'linewidth', 1.1, 'markerfacecolor', [36, 169, 225]/255)
hold on
plot(x, y2, 'ok-', 'linewidth', 1.1, 'markerfacecolor', [29, 191, 151]/255)
上面的散点内部填充颜色marker face color后面跟的值是我从博客上找的好看的颜色,网址https://www.icoa.cn/a/512.html。一般我找颜色都是这样子找,找到特别好看的颜色然后把他们的RGB值放上去。所以三个值就分别代表red, green, blue。后面的255代表归一化,因为RGB最高255。
所以目前做出来的图就是下面这样子,不得不说,好看很多了,图像变得更加清新、美观。因为粗细适中的线条与恰当的颜色最能够抓人眼球。
修改线条后但是这样一比,坐标轴就有点单调了,而且右上角的图例好小啊,整体就显得线条图像与坐标轴不是一个风格的,所以下面我们就需要修改坐标轴配置。
修改坐标轴
我们需要把坐标轴加粗,字体加大,字体改成Times New Roman,让线条不要紧靠边框,留一些“呼吸”的余地。
axis([0, 3*pi, -1.2 1.2])
set(gca, 'linewidth', 1.1, 'fontsize', 16, 'fontname', 'times')
然后就大功告成了!
大功告成不过你们肯定会有一个疑问,为什么要加大字体、加粗线条?
因为我们在电脑上单独看图像与放到文章中看图像的感觉是不一样的,在文章中,线条太细会让眼睛看起来很难受,无法直接抓住目光,这个图像就成为了背景板被忽视掉。而加粗线条就会让整个图像突出一些,配上好看的配色,就能够直接吸引目光,成为亮点。太粗的线条反而会让人感觉墨水撒了一样。
同样的,字体一般来说需要和文章字体大小差不多,我选的这个参数是按照我的经验比较万用的。
以上就是修改一幅图,让其变得更加好看的步骤。
所有的代码为
clc, clear, close all
x = linspace(0, 3*pi, 40);
y1 = sin(x);
y2 = 0.1*x-0.5;
y3 = cos(x+pi/2);
figure
% 黑色实线, 圆圈标记, 线宽1.1, 标记内部填充颜色从网上找好看的配色
plot(x, y1, 'ok-', 'linewidth', 1.1, 'markerfacecolor', [36, 169, 225]/255)
hold on
plot(x, y2, 'ok-', 'linewidth', 1.1, 'markerfacecolor', [29, 191, 151]/255)
% 设置坐标轴范围
axis([0, 3*pi, -1.2 1.2])
% 坐标轴边框线宽1.1, 坐标轴字体与大小为Times New Roman和16
set(gca, 'linewidth', 1.1, 'fontsize', 16, 'fontname', 'times')
xlabel('Time (s)')
ylabel('Displacement (m)')
legend('sin(x)', '0.1x-0.5')
下面则是对于Python的作图指令的介绍。
对于Python的作图的细节
基本原则和上文中的一样,只不过对应的操作要更麻烦一点:
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(0, 3*np.pi, 40)
y1 = np.sin(x)
y2 = 0.1*x-0.5
plt.figure(figsize=(12.5, 10))
# 线条颜色black, 线宽2, 标记大小13, 标记填充颜色从网上找16进制好看的颜色
plt.plot(x, y1, '-o', color='black', markersize=13, markerfacecolor='#44cef6', linewidth=2)
plt.plot(x, y2, '-o', color='black', markersize=13, markerfacecolor='#e29c45', linewidth=2)
# 字体设置: 字体名称Times New Roman, 字体大小34
font_format = {'family':'Times New Roman', 'size':34}
plt.xlabel('Time (s)', font_format)
plt.ylabel('Displacement (m)', font_format)
# 设置坐标轴 x范围0~3*pi, y范围-1.2~1.2
plt.axis([0, 3*np.pi, -1.2, 1.2])
# 横纵坐标上的字体大小与类型(不是xlabel, 是xticks)
plt.xticks(fontproperties='Times New Roman', size=34)
plt.yticks(fontproperties='Times New Roman', size=34)
# 整个图像与展示框的相对位置
plt.subplots_adjust(left=0.19,right=0.94, bottom=0.13)
# 调整上下左右四个边框的线宽为2
ax=plt.gca()
ax.spines['bottom'].set_linewidth(2)
ax.spines['left'].set_linewidth(2)
ax.spines['right'].set_linewidth(2)
ax.spines['top'].set_linewidth(2)
plt.show()
做出来的效果如下所示。
Python做的图总结
以上就是所有内容,作图的美观着实是一个很考验审美的问题。我现在看我一年前画的图简直是不要再尴尬,但是那时的我看两年前的我也是觉得很辣鸡,因为审美在不断地变化着。说不定一年后再看我现在的作图风格也会觉得很难看,谁知道呢?但目前为止这的确是一种比较好看的风格了,相对于普通人的作图水平来说。
所以希望我的这篇文章对大家有所帮助,如果喜欢的话麻烦来个关注,点个赞,加个收藏,谢谢!
网友评论