前言
在学习数据分析前,一定要有python基础,不一定要非常熟练的掌握这门语言,但一定要对python有个大概的了解(就像我一样,大一学过python,但是现在忘的差不多了,但是没关系,有个大致了解即可,遇到不会的再去Google就行😂)。
什么是matplotlib
matplotlib是最流行的python底层绘图库,主要做数据可视化图表,名字取自matlab,模仿matlib构建
我们为什么要学matplotlib
- 能将数据进行可视化,更直观的呈现。
- 使数据更加客观,更具说服力
正文
第一版
代码
from matplotlib import pyplot as plt
x=range(2,26,2)
y=[15,16,18,19,21,21,24,27,25,23,22,18]
plt.plot(x,y)
plt.show()
效果
这是最简略的版本,我们只是简单的把折线图画出来了,但是先不说别人能不能看明白,我们自己就看不明白。所以我们要改进。
要改进的问题:
- 设置图片大小
- 保存到本地
- 描述信息,比如x轴,y轴表示什么,这个图表示什么
- 调整x轴,y轴刻度的间距
- 线条的样式(比如颜色,透明度)
- 给图片加水印(防止图片被盗用)
第二版
代码
# 导入库
from matplotlib import pyplot as plt
# 解决中文乱码
import matplotlib
matplotlib.rc("font",family='FangSong')
# 初始化数据
# 数据在x轴的位置,是一个可迭代的对象,在y轴也是如此
# x轴和y轴的数据一起组成了所有要绘制出的坐标,分别是(2,15),(4,16).....(24.18)
x=range(2,26,2)
y=[15,16,18,19,21,21,24,27,25,23,22,18]
# 设置图片大小属性
# figsize设置画布的大小,第一个元素是长,第二个元素是宽
# dpi表示清晰度(我也不是很清楚,大概这么理解),越大图片越清晰
fig=plt.figure(figsize=(20,8),dpi=160)
# 添加描述信息,x/y轴表示什么,这个图形表示什么
# xlabel和ylabel都是设置横纵坐标的信息
# title是设置整张图片的信息,表示这张图片表示什么
plt.xlabel("时间")
plt.ylabel("温度(摄氏度)")
plt.title("一天中气温随时间变化曲线")
# 调整x/y轴的刻度间距
# 先准备一个列表,这个列表中的数据是x轴的刻度,然后将x轴刻度设置成列表中的数据。y轴也是如此。
x_ticks=range(2,25)
y_ticks=range(min(y),max(y)+1)
plt.xticks(x_ticks)
plt.yticks(y_ticks)
# 添加水印
plt.text(x=1, # 水印开头左下角对应的X点
y=35, # 水印开头左下角对应的Y点
s="Matplotlib", # 水印文本
fontsize=30, # 水印大小
color="gray", # 水印颜色
alpha=0.5) # 水印是通过透明度控制的
# 绘制图形
plt.plot(x,y)
# 保存到本地
plt.savefig("./image/pic1.svg")
# 展示图形
plt.show()
效果
进阶练习
需求:我们绘制一个折线图,表示我和同桌随年龄增长交往的朋友的数量,注意这里是要一个图里画两条线。
代码
# 一个小demo演示
from matplotlib import pyplot as plt
# 解决中文乱码
import matplotlib
matplotlib.rc("font",family='FangSong')
y_1 = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y_2 = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]
x = range(11,31)
fig=plt.figure(figsize=(20,8),dpi=160)
plt.xlabel("年龄")
plt.ylabel("交往的朋友数量(个)")
plt.title("随年龄增长交往的朋友数量")
x_ticks=["{}岁".format(i) for i in x]
plt.xticks(x,x_ticks)
plt.yticks(range(min(y),max(y)+3))
# 加上网格
plt.grid(alpha=.4,linestyle="-.")
# 设置线条样式
plt.plot(x,y_1,label="自己",color="r",linestyle=":")
plt.plot(x,y_2,label="同桌",color="b",linestyle="--")
plt.legend()
plt.show()
# plt.savefig("./image/pic2.svg")
注意
● 这里设置的x轴刻度带有中文,一般按照上面的格式来设置(应该还有其他方法,但是我才学疏浅,还没有掌握)。x_ticks是中文和数字组合的刻度的列表,最后用plt.plot()设置时要传两个参数,第一个参数是纯数字(一定要和x_ticks中的填充的数字一样),第二个参数就是x_ticks。
● 设置线条样式
颜色字符 | 风格字符 |
r红色 | - 实线 |
g绿色 | -- 虚线 |
b蓝色 | -. 点划线 |
w白色 | : 点虚线 |
c青色 | ' ' 留空或空格,无线条 |
m洋红 | |
y黄色 | |
k黑色 | |
#00ff0016 进制,自定义颜色 |
效果
代码
# 第二个小demo,演示十点到十二点的的气温变化
from matplotlib import pyplot as plt
# 解决中文乱码
import matplotlib
matplotlib.rc("font",family='FangSong')
x=range(0,120)
y=[random.randint(20,35) for i in range(120)]
fig=plt.figure(figsize=(20,8),dpi=200)
plt.xlabel("time")
plt.ylabel("气温")
x_ticks=["10点{}分".format(i) for i in range(60)]
x_ticks+=["11点{}分".format(i) for i in range(60)]
plt.xticks(list(x)[::3],x_ticks[::3],rotation=45)
plt.yticks(range(20,36))
plt.grid(alpha=.4)
plt.text(x=1, # 水印开头左下角对应的X点
y=35, # 水印开头左下角对应的Y点
s="Matplotlib", # 水印文本
fontsize=30, # 水印大小
color="gray", # 水印颜色
alpha=0.5) # 水印是通过透明度控制的
plt.plot(x,y)
plt.show()
# plt.savefig("./image/pic3.svg")
效果
说明
在设置x轴刻度时,我们会遇到两个问题。
● 如果太密集的话,我们进行切片操作。
● 如果太密集的话,我们对刻度进行旋转,rotation就是设置旋转的参数,传的参数就是旋转的度数(0度是横着,即与x轴平行)
总结
- 绘制折线图(plt.plot)
- 设置图片的大小和分辨率(plt.figure)
- 实现图片的保存(plt.savefig)
- 设置x/y轴上的刻度和字符串(plt.xticks和plt.yticks)
- 解决刻度稀疏和密集的问题(切片和旋转)
- 设置标题,xy轴的label(plt.titleplt.xlabelplt.ylabel)。特别的,如果有多条线的话,要在绘制时(plt.plot)设置每条线的标签,并且最后还要plt.legend。
- 设置字体,解决中文乱码的问题