一、matplotlib的介绍

  • 1.Matplotlib 是一个支持Python的2D的绘图库,可以绘制各种形式的图表
  • 2.Matplotlib可以绘制的图表有:线图、散布图、条状图、箱图、图片已经动画(但是对于动画师不专业,对于3D图不专业的)
  • 3.良好的操作系统兼容性
  • 4.绘制印刷级别的高质量图表
  • 5.可以在Python的脚本、Python Shell、IPython Shell、Jupyter Notebook、Web(返回js、css、html)
  • 6.核心对象:尺寸对象,plt在绘制图片的时候自动创建一个Figure对象。

二、图表的构成

  • 1.图表的标题
  • 2.图例部分
  • 3.XY轴标签部分
  • 4.XY轴的刻度部分
  • 5.图形部分
  • 6.图形的标签
import numpy as np
#scikit-python 
import scipy.stats as stats
import matplotlib.pyplot as plt
import matplotlib.style as style#风格

#防止图形显示不出来,进行强制显示
%matplotlib inline

#设置图表清晰度和字体
style.use('fivethirtyeight')#风格
plt.rcParams["figure.figsize"] = (14,7)#参数:尺寸
plt.figure(dpi=80)#清晰度

#图形部分
X = np.linspace(-4,4,100)#-44,一百个
y = stats.norm.pdf(X) / np.max(stats.norm.pdf(X))#stats.norm.pdf(X)是高斯分布


#绘制一条线
#PDF
plt.plot(X,y)

#把线的下方进行填充
plt.fill_between(X,y,alpha=.3)#alpha是模糊程度,透明程度

#CDF分布函数
plt.plot(X,stats.norm.cdf(X))#这个就不要填充了,他不是密度函数,是分布函数cdf

#图形注释

#x代表x轴的坐标
#y代表y轴的坐标
#s师注释的字符串
#rotation是旋转的角度
#alpha是透明度
#weight加粗
#color字体的颜色
plt.text(x=-1.3,y=.7,s='pdf',rotation=65,alpha=.75,weight='bold',color='#0000FF')#xy是注释的位置,weight='bold'加粗
plt.text(x=-.35,y=.5,s='cdf',rotation=55,alpha=.75,weight='bold',color='#fc4f30')#xy是注释的位置,weight='bold'加粗

#设置图例,要按顺序去写,先画的pdf
plt.legend(['PDF','CDF'])

#标题
plt.title("Demo")

#X,Y轴的标签
plt.xlabel('X',color='red')
plt.ylabel('Y',color='red',rotation=0)#rotation是旋转的角度

#设置刻度
plt.axis([-5,5,0,1.2])# [xmin xmax ymin ymax]

#保存图片
plt.savefig('./imgs/pdf.png',dpi=200)

#用图片可以写数据分析的报告 word

三、线性图形的绘制

1.绘制的基本过程

  • 首先,线性图形是一个函数的关系 f ( x ) = e − z 2 f(x)=e^{-z^2} f(x)=ez2
  • 然后,这个函数之间的关系是向量之间的关系
import numpy as np
#scikit-python 
import scipy.stats as stats
import matplotlib.pyplot as plt
import matplotlib.style as style

#防止图形显示不出来,进行强制显示
%matplotlib inline

#设置背景风格
style.use('fivethirtyeight')

#设置图片画布的尺寸
plt.rcParams["figure.figsize"] = (14,7)

#【重要】设置支持中文,windows可以设置字***置,但是linux'不行,所以我们要记住这个方法
plt.rcParams['font.family'] = ['SimHei']

#设置清晰度
plt.figure(dpi=100)

#设置X轴的向量
X = np.arange(-np.pi,np.pi,.1)#等差数列,数轴范围(-np.pi,np.pi),间隔0.1
#设置y于x轴的关系函数式
#exp 以e为底数的指数型函数
y = np.exp(-X**2.2)

#绘制图形
plt.plot(X,y)

#添加标题
plt.title('示例')

#保存图片
plt.savefig('./imgs/line.png',dpi=100)

2.使用交互式显示方式

  • %matplotlib inline修改为%matplotlib notebook就转变为动态图片了
  • 交互形式是动态的,点击关闭按钮的化还是会变成静态的。
%pylab

%matplotlib qt5

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.style as style
import warnings

#忽略警告提示信息
warnings.filterwarnings('ignore')


#设置图片嵌入在jupyter中,在其它的编译工具中不起作用
%matplotlib notebook

#设置背景风格
style.use('fivethirtyeight')

#设置图片尺寸
plt.rcParams["figure.figsize"] = (8,4)

#设置当前图片支持中文的黑体,目前在windows操作系统下有作用
plt.rcParams['font.family'] = ['SimHei']

#设置清晰度
plt.figure(dpi=100)

#设置X轴的向量
X = np.arange(-np.pi,np.pi,0.1)

#y轴和X轴的关系(例如当X=1的时候y=2,当X=2的时候y=4,y=2X)
y = np.exp(-X**2.2)

#设置中文标题
plt.title('动态绘制线型图')

#绘制图形
plt.plot(X,y)

#保存图形
plt.savefig('./imgs/line2.png',dpi=100)

3.设置LateX符号

  • LateX是算法之父高德纳编写的一款学术型文档编译工具
  • 他支持各种希腊字母和其它数学符号的编写
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.style as style
import warnings

#忽略警告提示信息
warnings.filterwarnings('ignore')

#设置图片嵌入在jupyter中,在其它的编译工具中不起作用
%matplotlib inline

#设置背景风格
style.use('fivethirtyeight')

#设置图片尺寸
plt.rcParams["figure.figsize"] = (8,4)

#设置当前图片支持中文的黑体,目前在windows操作系统下有作用
plt.rcParams['font.family'] = ['SimHei']

#当设置中文以后,负号的显示也会出现问题,我们需要对符号进行控制【重要】
plt.rcParams['axes.unicode_minus'] = False

#设置清晰度
plt.figure(dpi=100)

X = np.arange(-np.pi,np.pi,0.1)
y1 = np.sin(X)
y2 = np.cos(X)

plt.title('绘制线条')

plt.plot(X,y1)
plt.plot(X,y2)

#将LateX映射到数轴当中【重要】
pi = np.pi

#替换轴

#1.确定好你需要的新的刻度的数值
ticks = [-pi,-pi/2,0,pi/2,pi]

#2.确定好你需要确定新符号【LateX符号】
labels = ['$-\pi$','$-\pi/2$','$zero$','$\pi/2$','$\pi$']

#替换x轴
plt.xticks(ticks,labels,color='orange',rotation=30)

#替换轴
plt.yticks([-1,0,1],['Max','Zero','Min'],color='orange',rotation=30)

#保存
plt.savefig('./imgs/double.png',dpi=100)

4.点、线样式设置

  • 控制线的形状
  • 控制点的形状
  • 控制颜色和透明度
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.style as style
import warnings

#忽略警告提示信息
warnings.filterwarnings('ignore')

#设置图片嵌入在jupyter中,在其它的编译工具中不起作用
%matplotlib inline

#设置背景风格
style.use('fivethirtyeight')

#设置图片尺寸
plt.rcParams["figure.figsize"] = (8,4)

#设置当前图片支持中文的黑体,目前在windows操作系统下有作用
plt.rcParams['font.family'] = ['SimHei']

#当设置中文以后,负号的显示也会出现问题,我们需要对符号进行控制
plt.rcParams['axes.unicode_minus'] = False

#设置清晰度
plt.figure(dpi=100)

X = np.arange(-np.pi,np.pi,0.1)
y = np.exp(-X**2)

#linestyle  ls  线的样式  【-实线】【-- 虚线】  【:点状虚线】   【step阶梯线】 【-.感叹号线】
#linewidth  lw  线的宽度
#marker参数控制点的显示问题  【s正方形】  【d 菱形】  【o 圆形】    【x 叉】 
#markersize 控制点大小的

plt.plot(X,y,ls='-.',lw=5,marker='x',markersize=15,c='g')#c='g'是颜色

plt.savefig('./imgs/line_marker.png',dpi=100)

四、绘制其它图形

1.柱状图的绘制

柱状图 ,又叫做长条图、棒状图、条状图,是一种以长方形的长度为变量的统计图形。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.style as style
import warnings

#忽略警告提示信息
warnings.filterwarnings('ignore')

#设置图片嵌入在jupyter中,在其它的编译工具中不起作用
%matplotlib inline

#设置背景风格
style.use('fivethirtyeight')

#设置图片尺寸
plt.rcParams["figure.figsize"] = (8,4)

#设置当前图片支持中文的黑体,目前在windows操作系统下有作用
plt.rcParams['font.family'] = ['SimHei']

#当设置中文以后,负号的显示也会出现问题,我们需要对符号进行控制
plt.rcParams['axes.unicode_minus'] = False

#设置清晰度
plt.figure(dpi=100)

X1 = [1,3,5,7,9]
y1 = [3,7,1,2,4]

X2 = [2,4,6,8,10]
y2 = [2,1,3,6,7]

plt.barh(X1,y1,label='one')
plt.barh(X2,y2,label='two')

#添加图例
#图例调节位置 loc=[]
#图例的列数控制 cols
plt.legend(loc=[0,1],ncol=2)

plt.title('柱状图')

plt.xticks(range(0,10))

plt.savefig('./imgs/bar.png',dpi=100)

2.饼图

常用于统计学模块,是一个标准的2D图形,用手绘制,需要时用圆规。

饼图所表示的统计值时比例。

plt.pie()参数如下:

  • X参数代表的时各个扇形面的数据集
  • labels是每一个扇面的标签
  • shadow设置阴影
  • colors是每个扇面的颜色
  • explode设置各个扇面的脱离效果
  • autopct 设置扇面显示的百分比效果
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.style as style
import warnings
import seaborn as sns

#忽略警告提示信息
warnings.filterwarnings('ignore')

#设置图片嵌入在jupyter中,在其它的编译工具中不起作用
%matplotlib inline

#设置背景风格
style.use('fivethirtyeight')

#设置图片尺寸
plt.rcParams["figure.figsize"] = (8,8)

#设置当前图片支持中文的黑体,目前在windows操作系统下有作用
plt.rcParams['font.family'] = ['SimHei']

#当设置中文以后,负号的显示也会出现问题,我们需要对符号进行控制
plt.rcParams['axes.unicode_minus'] = False

#设置清晰度
plt.figure(dpi=100)

X = [24314.43, 47535.45, 35680.25, 57425.87, 62457.97, 24578.56, 65617.84, 43634.54, 49596.93,23568.31]
labels = ['广东','江苏','山东','浙江','河南','四川','湖北','湖南','河北','福建']

#找到GDP最高的省份
explode = np.zeros(shape=len(X))
max_index = np.argmax(X)

#将GDP最高的省脱离出去【重要】,explode=explode,把最高的那个剔除出来了,explode[max_index] = .1这个写1的话太远了
explode[max_index] = .1
a=plt.pie(X,labels=labels,autopct='%.2f%%',explode=explode,colors=sns.color_palette(palette='autumn',n_colors=len(X)))

#控制x和y轴的长度相同
plt.axis('equal')

#保存
plt.savefig('./imgs/pie.png',dpi=100)

3.散布图



散布图又叫做相关图,它是指用来研究两个变量之间是否存在相关关系的一种图形。

在质量检测的原因分析中。这些变量的关系往往不能进行解析描述。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.style as style
import warnings

#忽略警告提示信息
warnings.filterwarnings('ignore')

#设置图片嵌入在jupyter中,在其它的编译工具中不起作用
%matplotlib inline

#设置背景风格

style.use('fivethirtyeight')
#设置图片尺寸
plt.rcParams["figure.figsize"] = (6,4)

#设置当前图片支持中文的黑体,目前在windows操作系统下有作用
plt.rcParams['font.family'] = ['SimHei']

#当设置中文以后,负号的显示也会出现问题,我们需要对符号进行控制
plt.rcParams['axes.unicode_minus'] = False

#设置清晰度
plt.figure(dpi=100)

X = np.arange(20)
y = X**3

plt.scatter(X,y)

plt.savefig('./imgs/sca.png',dpi=100)

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.style as style
import warnings

#忽略警告提示信息
warnings.filterwarnings('ignore')

#设置图片嵌入在jupyter中,在其它的编译工具中不起作用
%matplotlib inline

#设置背景风格
style.use('fivethirtyeight')

#设置图片尺寸
plt.rcParams["figure.figsize"] = (6,4)

#设置当前图片支持中文的黑体,目前在windows操作系统下有作用
plt.rcParams['font.family'] = ['SimHei']

#当设置中文以后,负号的显示也会出现问题,我们需要对符号进行控制
plt.rcParams['axes.unicode_minus'] = False

#设置清晰度
plt.figure(dpi=100)

X = np.random.randint(10,100,1000)
y = np.random.randint(10,100,1000)

for i in range(1000):#每次都不同,用for循环产生
    c = np.random.random(3)#颜色随机
    s = np.random.randint(5,100)#点的大小随机
    
    plt.scatter(X[i],y[i],marker='d',color=c,s=s)#marker='d'是菱形
#plt.scatter(X,y)
#控制刻度轴的范围
plt.axis([0,115,0,115])

五、绘制子图表

有时候我们需要的是多张图像,而不是所有的图表在一张图像中,但是plt对象每次只能产生一个画布。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.style as style
import warnings

#忽略警告提示信息
warnings.filterwarnings('ignore')

#设置图片嵌入在jupyter中,在其它的编译工具中不起作用
%matplotlib inline

#设置背景风格
style.use('fivethirtyeight')

#设置图片尺寸
plt.rcParams["figure.figsize"] = (2*8,2*6)

#设置当前图片支持中文的黑体,目前在windows操作系统下有作用
plt.rcParams['font.family'] = ['SimHei']

#当设置中文以后,负号的显示也会出现问题,我们需要对符号进行控制
plt.rcParams['axes.unicode_minus'] = False

plt.figure(dpi=100)

X = np.linspace(-10,10,100)

y1 = X**3
y2 = X
y3 = np.sqrt(X)
y4 = np.cos(X)

#子图表生成几个,默认是一个【重要】
fig,ax = plt.subplots(nrows=2, ncols=2)#两行两列的表

#第一张图
#plt.title() 类对象
#ax[0,0]示例对象.set_title()  在plt中只要是示例对象,所有的方法都要带  set_前缀
ax[0,0].set_title('幂次关系1')
ax[0,0].scatter(X,y1,alpha=.5)#alpha=.5透明度

#第二张
ax[0,1].set_title('全相关')
ax[0,1].scatter(X,y2,alpha=.5,color='r')

#第三张
ax[1,0].set_title('幂次关系2')
ax[1,0].scatter(X,y3,alpha=.5,color='orange')

#第三张
ax[1,1].set_title('周期性')
ax[1,1].scatter(X,y4,alpha=.5,color='purple')

#保存
plt.savefig('./imgs/subplots.png',dpi=200)