Matplotlib绘图指南
1. 添加库¶
# 所有函数需要用plt.方法 import matplotlib.pyplot as plt # 如果引入则可以直接使用方法 from pylab import *
测试函数¶
实现绘制一个简单图像,创建一个基本图表有三个步骤
# 引入 matplotlib 库 import matplotlib.pyplot as plt # 第一步 设置数据 n = [1,2,3] # 第二布 绘制图像 plt.plot(n) # 第三布 显示图表 plt.show()
2. 设置窗口-figure¶
一个figure就是一个窗口,窗口是用来存放图示的,可以在一个窗口下放置多张图,也可以同时开辟多个窗口
import matplotlib.pyplot as plt # 函数 作用 # figure('标题') 用于创建一个窗口 # subplot(位置) 表示图标显示的位置 # 设置数据 x = [1,2,3,4] y = [5,4,3,2] # 开辟一个新的窗口 名字为 实例 # 这句话下面都是针对这个窗口的 plt.figure('实例') # 分割成一个1*3的区域 把图放在区域1 plt.subplot(131) # 绘制直线图 plt.plot(x, y) # 分割成一个1*3的区域 把图放在区域2 plt.subplot(132) # 绘制柱状图(直方图) plt.bar(x, y) # 分割成一个1*3的区域 把图放在区域3 plt.subplot(133) # 绘制散点图 plt.scatter(x, y) plt.show()
figure(dpi=100,figsize=(10,6)) dpi表示大小,figsize控制长宽
axis('equal') 将界面设置成1:1
3. 设置坐标轴¶
3.1 设置坐标轴名称¶
在坐标轴生成文字-xlabel/ylabel
- xlabel('名字',fontsize=大小) x轴的名字字体大小
- ylabel('y',fontsize=24) y轴的名字字体大小
- tick_params(axis='both',labelsize=14) x,y同时调整刻度字体大小
import numpy as np import matplotlib.pyplot as plt # 显示中文 plt.rcParams['font.sans-serif'] = [u'SimHei'] plt.rcParams['axes.unicode_minus'] = False x=np.arange(1,20) # 坐标轴生成文字 plt.xlabel('示例x轴') plt.ylabel('示例y轴') plt.plot(x,x*x) plt.show()
更好看的字体,空格需要加转义字符\,用一些希腊字符标记
import matplotlib.pyplot as plt import numpy as np x = np.linspace(-2, 2, 50) y1 = -5*x + 3 y2 = x**3 plt.figure(num=222) plt.plot(x, y2) plt.plot(x, y1, "y--", linewidth=2.0) # 更好看的字体,空格需要加转义字符\ plt.title(r'$label\ title$') plt.xlabel(r'$xlabel$') plt.ylabel(r'$ylabel$') plt.show()
3.2显示网格-grid¶
import numpy as np import matplotlib.pyplot as plt %matplotlib inline x='a','b','c','d' y=[15,30,45,10] # 开启网格 plt.grid() # 也可以设置颜色、线条宽度、线条样式 # plt.grid(color='g',linewidth='1',linestyle='-.') plt.plot(x,y) plt.show()
3.3 调整坐标轴刻度¶
3.3.1 坐标轴刻度的个数¶
主要通过locator_params
实现
同时调整x轴和y轴:plt.locator_params(nbins=20) 只调整x轴:plt.locator_params(‘'x',nbins=20) 只调整y轴:plt.locator_params(‘'y',nbins=20)
import numpy as np import matplotlib.pyplot as plt %matplotlib inline x=np.arange(0,30,1) plt.plot(x,x) # x轴和y轴分别显示20个 plt.locator_params(nbins=20) plt.show()
3.3.2 坐标轴范围¶
axis/xlim/ylim
- axis:[0,5,0,10],x从0到5,y从0到10
- xlim:对应参数有xmin和xmax,分别能调整最大值最小值
- ylim:同xlim用法
范例:
- xlim(-3.0,3.0)/ylim(-3.0,3.0) x,y轴区间单独调整
- axis([1,1100,0,1100000]) 同时调整xy的区间
import numpy as np import matplotlib.pyplot as plt %matplotlib inline x=np.arange(0,30,1) plt.plot(x,x*x) #显示坐标轴,plt.axis(),4个数字分别代表x轴和y轴的最小坐标,最大坐标 #调整x为10到25 plt.xlim(xmin=10,xmax=25) plt.plot(x,x*x) plt.show()
3.3.3 刻度改成字符串¶
同样可以使得坐标轴显示的不是数字,是字符串
import matplotlib.pyplot as plt import numpy as np x = np.linspace(-2, 2, 50) y1 = -5*x + 3 y2 = x**3 plt.figure(num=222) plt.plot(x, y2) plt.plot(x, y1, "y--", linewidth=2.0) plt.title('use limit') plt.xlabel('x_label') plt.ylabel('y_label') # use limit plt.xlim((-1.5, 1.5)) plt.ylim((-2, 2)) # use tick # -1.5 -0.75 0 0.75 1.5 # input : list or array new_ticks = np.linspace(-1.5, 1.5, 5) plt.xticks(new_ticks) # 把对应的tick换成string plt.yticks([-2, -1.2, -0.2, 1.11, 2], ['codes', 'design', 'to', 'like', 'I']) plt.show()
3.4 添加双坐标轴-twinx¶
import numpy as np import matplotlib.pyplot as plt %matplotlib inline x=np.arange(1,20) y1=x*x y2=np.log(x) plt.plot(x,y1) # 添加一个坐标轴,默认0到1 plt.twinx() plt.plot(x,y2,'r') plt.show()
输出:
3.5 隐藏坐标轴线¶
# 隐藏x,y轴 plt.axes().get_xaxis().set_visible(False) plt.axes().get_yaxis().set_visible(False)
4. 添加标题-title¶
用于在图标上方生成标题
import numpy as np import matplotlib.pyplot as plt # 显示中文 plt.rcParams['font.sans-serif'] = [u'SimHei'] plt.rcParams['axes.unicode_minus'] = False # 生成函数 x=np.arange(0,10) # 生成标题 plt.title('这是一个示例标题') plt.plot(x,x*x) plt.show()
5. 添加文字-text¶
这个主要是为了在图片中间坐标位置生成文字
import numpy as np import matplotlib.pyplot as plt # 显示中文 plt.rcParams['font.sans-serif'] = [u'SimHei'] plt.rcParams['axes.unicode_minus'] = False x=np.arange(-10,11,1) y=x*x plt.plot(x,y) plt.title('这是一个示例标题') # 添加文字,在坐标位置生成文字 plt.text(-2.5,30,'function y=x*x') plt.show()
6. 添加注释-annotate¶
- xy:为备注的坐标点
- xytext:备注文字的坐标(默认为xy的位置)
- arrowprops:在xy和xytext之间绘制一个箭头
注解:会有一个箭头指向需要标注的位置
import numpy as np import matplotlib.pyplot as plt # 显示中文 plt.rcParams['font.sans-serif'] = [u'SimHei'] plt.rcParams['axes.unicode_minus'] = False x=np.arange(-10,11,1) y=x*x plt.title('这是一个示例标题') plt.plot(x,y) # 添加注释 plt.annotate('这是一个示例注释',xy=(0,1),xytext=(-2,22),arrowprops={'headwidth':10,'facecolor':'r'}) plt.show()
7. 添加图例-legend¶
图例就是比如显示不同线条时,比如虚线,曲线等分别表示的意思
import numpy as np import matplotlib.pyplot as plt # 显示中文 plt.rcParams['font.sans-serif'] = [u'SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.plot(x,x) plt.plot(x,x*2) plt.plot(x,x*3) plt.plot(x,x*4) # 直接传入legend plt.legend(['生活','颜值','工作','金钱']) plt.show()
8. 显示数学公式-mathtext¶
格式如下: 作为开始和结束符,如\omega $,中间的将解析出公式中的符号
import numpy as np import matplotlib.pyplot as plt %matplotlib inline plt.title('chenqionghe') plt.xlim([1,8]) plt.ylim([1,5]) plt.text(2,4,r'$ \alpha \beta \pi \lambda \omega $',size=25) plt.text(4,4,r'$ \sin(0)=\cos(\frac{\pi}{2}) $',size=25) plt.text(2,2,r'$ \lim_{x \rightarrow y} \frac{1}{x^3} $',size=25) plt.text(4,2,r'$ \sqrt[4]{x}=\sqrt{y} $',size=25) plt.show()
输出:
9. 调整日期自适应-autofmt_xdate¶
有时候显示日期会重叠在一起,非常不友好,调用plt.gcf().autofmt_xdate(),将自动调整角度
import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline x=pd.date_range('2020/01/01',periods=30) y=np.arange(0,30,1) plt.plot(x,y) plt.gcf().autofmt_xdate() plt.show()
10. 填充区域-fill/fill_beween¶
fill填充函数区域
import numpy as np import matplotlib.pyplot as plt # 显示中文 plt.rcParams['font.sans-serif'] = [u'SimHei'] plt.rcParams['axes.unicode_minus'] = False %matplotlib inline x=np.linspace(0,5*np.pi,1000) y1=np.sin(x) y2=np.sin(2*x) plt.plot(x,y1) plt.plot(x,y2) # 填充 plt.fill(x,y1,'g') plt.fill(x,y2,'r') plt.title('这是一个示例标题') plt.show()
输出:
fill_beween填充函数交叉区域
import numpy as np import matplotlib.pyplot as plt # 显示中文 plt.rcParams['font.sans-serif'] = [u'SimHei'] plt.rcParams['axes.unicode_minus'] = False %matplotlib inline plt.title('这是一个示例标题') x=np.linspace(0,5*np.pi,1000) y1=np.sin(x) y2=np.sin(2*x) plt.plot(x,y1) plt.plot(x,y2) # 填充 plt.fill_between(x,y1,y2,where=y1>y2,interpolate=True) plt.show()
输出:
11. 画多边形-matplotlib.patche¶
import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as mptaches %matplotlib inline xy1=np.array([0.2,0.2]) xy2=np.array([0.2,0.8]) xy3=np.array([0.8,0.2]) xy4=np.array([0.8,0.8]) fig,ax=plt.subplots() #圆形,指定坐标和半径 circle=mptaches.Circle(xy1,0.15) ax.add_patch(circle) #长方形 rect=mptaches.Rectangle(xy2,0.2,0.1,color='r') ax.add_patch(rect) #多边形 polygon=mptaches.RegularPolygon(xy3,6,0.1,color='g') ax.add_patch(polygon) # 椭圆 ellipse=mptaches.Ellipse(xy4,0.4,0.2,color='c') ax.add_patch(ellipse) ax.axis('equal') plt.show()
输出:
12. 切换样式-plt.style.use¶
matplotlib支持多种样式,可以通过plt.style.use切换样式,例如:plt.style.use('ggplot')
输入 plt.style.available
可以查看所有的样式:
import matplotlib.pyplot as plt plt.style.available
示例代码,ggplot样式:
import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as mptaches %matplotlib inline plt.style.use('ggplot') # 新建4个子图 fig,axes=plt.subplots(2,2) ax1,ax2,ax3,ax4=axes.ravel() # 第一个图 x,y=np.random.normal(size=(2,100)) ax1.plot(x,y,'o') # 第二个图 x=np.arange(0,10) y=np.arange(0,10) colors=plt.rcParams['axes.prop_cycle'] length=np.linspace(0,10,len(colors)) for s in length: ax2.plot(x,y+s,'-') # 第三个图 x=np.arange(5) y1,y2,y3=np.random.randint(1,25,size=(3,5)) width=0.25 ax3.bar(x,y1,width) ax3.bar(x+width,y2,width) ax3.bar(x+2*width,y3,width) # 第四个图 for i,color in enumerate(colors): xy=np.random.normal(size=2) ax4.add_patch(plt.Circle(xy,radius=0.3,color=color['color'])) ax4.axis('equal') plt.show()
输出:
13. 保存图片¶
保存图表图片,tight'表示去空白
savefig('.png',bbox_inches='tight')
plt.plot(temp.iloc[-90:,1], color='blue', label='Actual') plt.plot(temp.iloc[-90:,2],color='green', label='Forecast before completion') plt.plot(t1.iloc[-90:,0],color='red', label='Forecast after completion') plt.legend(loc='best',fontsize=9) plt.title('ST-MVL补全前后预测对比图' , fontsize=16) # 调整刻度方向 plt.xticks(rotation=0) # 调整刻度大小 plt.tick_params(labelsize=9) plt.xlabel('time', fontsize=9) plt.ylabel('Radial displacement monitoring data', fontsize=10) plt.grid() # 生成网格 # 保存图片,dpi是图片像素、bbox_inches保证图片不会发生局部丢失 fig.savefig('./地铁进站流预测2.jpg', bbox_inches = 'tight',dpi=1000) plt.show()
14. 各类图示¶
14.1 折线图-plot¶
折线图可以用来表示数据随着时间变化的趋势,也是用的最多的图示
14.1.1 基本参数介绍¶
plt.plot(x,y,linewidth=5,color='red',ls='--',label='food')
- linewidth表示直线的宽度
- ls='--'表示直线的样式
- label='food',设置图片的名字,这个属性要搭配,plt.legend()才能显示
- color:线条颜色,color=’green’
- linestyle:线条风格,linestyle=’--’
- marker:标记风格,marker = ‘o’
- markerfacecolor:标记本身的颜色,markerfacecolor = ‘blue’
- markersize:标记尺寸,markersize = ‘20’
线条风格
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019] y = [5, 3, 6, 20, 17, 16, 19, 30, 32, 35] plt.plot(x, y) plt.show() # df = pd.DataFrame({'x': x, 'y': y}) # sns.lineplot(x="x", y="y", data=df) # plt.show()
也可以直接用numpy直接生成函数
import matplotlib.pyplot as plt import numpy as np # 利用 numpy产生一个-5到5的100个等分点 # 利用 numpy产生一个-5到5的100个等分点 # 一般等分的越多则最终画出的图形就光滑 # 因为这里y其实是通过一个映射函数得到的一个y集合 # 等分越多说明点越多的去表示,则越光滑,反正则有很多棱角 x = np.linspace(-5, 5, 100) y = x**3 # plot显示 plt.plot(x, y) # 一定要有这句话,否则不显示 plt.show()
14.1.2 调整颜色-color¶
import numpy as np import matplotlib.pyplot as plt %matplotlib inline x=np.arange(1,5) #颜色的几种方式 plt.plot(x,color='g') plt.plot(x+1,color='0.5') plt.plot(x+2,color='#FF00FF') plt.plot(x+3,color=(0.1,0.2,0.3)) plt.show()
14.1.3 切换线条样式-marker¶
**标记**就是在线条上会有一些形状图案
import numpy as np import matplotlib.pyplot as plt %matplotlib inline x=np.arange(1,5) plt.plot(x,marker='o') plt.plot(x+1,marker='>') plt.plot(x+2,marker='s') plt.show()
14.2 直方图-hist¶
直方图是比较常见的视图,它是把横坐标等分成了一定数量的小区间,然后在每个小区间内用矩形条(bars)展示该区间的数值。
a = np.random.randn(100) s = pd.Series(a) plt.hist(s) plt.show() sns.distplot(s, kde=False) plt.show() sns.distplot(s, kde=True) plt.show()
14.3 垂直条形图-bar¶
条形图可以帮我们查看类别的特征。在条形图中,长条形的长度表示类别的频数,宽度表示类别。
x = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5'] y = [5, 4, 8, 12, 7] plt.bar(x, y) plt.show()
14.4 水平条形图-barh¶
x = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5'] y = [5, 4, 8, 12, 7] plt.barh(x, y) plt.show()
14.5 饼图-pie¶
nums = [25, 37, 33, 37, 6] labels = ['High-school','Bachelor','Master','Ph.d', 'Others'] plt.pie(x = nums, labels=labels) plt.show()
14.6 箱线图-boxplot¶
箱线图由五个数值点组成:最大值 (max)、最小值 (min)、中位数 (median) 和上下四分位数 (Q3, Q1)。可以帮我们分析出数据的差异性、离散程度和异常值等。
# 生成0-1之间的10*4维度数据 data=np.random.normal(size=(10,4)) lables = ['A','B','C','D'] # 用Matplotlib画箱线图 plt.boxplot(data,labels=lables) plt.show()
用Seaborn画箱线图
# 用Seaborn画箱线图 df = pd.DataFrame(data, columns=lables) sns.boxplot(data=df) plt.show()
14.7 热力图-heatmap¶
力图,英文叫 heat map,是一种矩阵表示方法,其中矩阵中的元素值用颜色来代表,不同的颜色代表不同大小的值。通过颜色就能直观地知道某个位置上数值的大小。
flights = sns.load_dataset("flights") data=flights.pivot('year','month','passengers') sns.heatmap(data) plt.show()
14.8 散点图¶
散点图的英文叫做 scatter plot,它将两个变量的值显示在二维坐标中,非常适合展示两个变量之间的关系。
plt.scatter(x,y,s=2,c=y,cmap = plt.cm.Blues,edgecolor='none')
- s表示散点大小
- c表示散点的颜色
- cmap = plt.cm.Blues表示设置蓝色渐变
- edgecolor='none'去除轮廓使得图线光滑
N = 1000 x = np.random.randn(N) y = np.random.randn(N) plt.scatter(x, y,marker='x') plt.show()
其他
df = pd.DataFrame({'x': x, 'y': y}) sns.jointplot(x="x", y="y", data=df, kind='scatter'); plt.show()
14.9 蜘蛛图¶
蜘蛛图是一种显示一对多关系的方法,使一个变量相对于另一个变量的显著性是清晰可见。
labels=np.array([u"推进","KDA",u"生存",u"团战",u"发育",u"输出"]) stats=[83, 61, 95, 67, 76, 88] # 画图数据准备,角度、状态值 angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False) stats=np.concatenate((stats,[stats[0]])) angles=np.concatenate((angles,[angles[0]])) # 用Matplotlib画蜘蛛图 fig = plt.figure() ax = fig.add_subplot(111, polar=True) ax.plot(angles, stats, 'o-', linewidth=2) ax.fill(angles, stats, alpha=0.25) ax.set_thetagrids(angles * 180/np.pi, labels) plt.show()
14.10 二元变量分布¶
# 两个变量的关系 tips = sns.load_dataset("tips") tips.head(10) #散点图 sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter') #核密度图 sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde') #Hexbin图 sns.jointplot(x="total_bill", y="tip", data=tips, kind='hex') plt.show()
14.11 面积图¶
面积图又称区域图,强调数量随时间而变化的程度,也可用于引起人们对总值趋势的注意。堆积面积图还可以显示部分与整体的关系。折线图和面积图都可以用来帮助我们对趋势进行分析,当数据集有合计关系或者你想要展示局部与整体关系的时候,使用面积图为更好的选择。
df = pd.DataFrame( np.random.rand(10, 4), columns=['a', 'b', 'c', 'd']) # 堆面积图 df.plot.area() # 面积图 df.plot.area(stacked=False)
14.12 六边形-hexbin¶
六边形图将空间中的点聚合成六边形,然后根据六边形内部的值为这些六边形上色。
df = pd.DataFrame(np.random.randn(1000, 2), columns=['a', 'b']) df['b'] = df['b'] + np.arange(1000) # 关键字参数gridsize;它控制x方向上的六边形数量,默认为100,较大的gridsize意味着更多,更小的bin df.plot.hexbin(x='a', y='b', gridsize=25)