Python数据分析——matplotlib知识总结

文章目录

  • 前言
  • 常见问题
    • 在pycharm中不会单独弹出图片
    • 中文乱码问题
    • 常见的中文字体都有哪些?
    • 修改图片尺寸
    • figure是什么?
    • 好看的颜色
    • 如何去除xy轴
    • 坐标轴旋转一定角度
    • 保存图片指定分辨率
    • 如何移动、隐藏坐标轴
    • 如何显示图片
  • 绘图示例
    • 折线图、曲线图(plot)
    • 散点图(scatter)很美
    • 直方图(bar)
    • 竖着两个直方图
    • 柱状图(hist)
    • 饼状图(pie)
    • 箱型图(boxplot)
    • 等高线图(contourf)
    • 3D图(mpl_toolkits.mplot3d import Axes3D)
    • 动态图(animation.FuncAnimation)
    • 两个Y轴数据
    • 修改坐标轴位置
  • 图形美化
    • 设置风格
    • 设置坐标轴标签,标题
    • 限制xy的范围,相当于截取图形了
    • 设置xy轴精度
    • 用文字代替轴的数字
    • 坐标轴的颜色和样式
    • 添加图例
    • 添加网格
    • 添加标注、文字注释、数学公式
    • 一张图多个图形
    • 同时生成多张图
    • 颜色和样式
  • 进阶
    • 三种方式画图
    • 添加多个坐标轴
    • 指定区域填充颜色
    • 绘制图形
  • 综合实例
    • 绘制函数积分图
    • 绘制极坐标
    • 绘制正弦函数
    • 绘制带坐标轴的反比例函数

前言

是最常用的可视化库,可以绘制2D,3D图等

其他的还有

seaborn:seaborn就是在matplotlib基础上面的封装,方便直接传参数调用

pyecharts:pyecharts是一款将python与echarts结合的强大的数据可视化工具

常见问题

在pycharm中不会单独弹出图片

也不用改什么文档,直接在最顶行加上以下代码即可

import matplotlib; matplotlib.use('TkAgg')

中文乱码问题

加入以下代码即可解决

import matplotlib.pyplot as plt
import matplotlib; matplotlib.use('TkAgg')


plt.rcParams['font.sans-serif']=['SimHei']  # 指定默认字体 SimHei为黑体
plt.rcParams['axes.unicode_minus']=False  # 用来正常显示负号

或者是实例化字体对象

import numpy as np
import matplotlib.pyplot as plt
import matplotlib; matplotlib.use('TkAgg')
from matplotlib import font_manager
# # 中文字体准备
my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/msyh.ttc")  # 设置字体为微软雅黑
plt.xticks(barrage_type, fontproperties=my_font)

常见的中文字体都有哪些?

黑体 SimHei 微软雅黑 Microsoft YaHei

微软正黑体 Microsoft JhengHei 新宋体 NSimSun

新细明体 PMingLiU 细明体 MingLiU

标楷体 DFKai-SB 仿宋 FangSong

楷体 KaiTi 仿宋_GB2312 FangSong_GB2312

楷体_GB2312 KaiTi_GB2312

fantasy这个好看

修改图片尺寸

提供两种方法,我喜欢第二种

# plt.rcParams['figure.figsize'] = (16.0, 7.0)
plt.figure(figsize=(16, 7))  #都可以

figure是什么?

创建绘图对象,简单来说就是你同时弹出几个图片,不单独创建则会默认创建一个

import matplotlib; matplotlib.use('TkAgg')
from matplotlib import pyplot as plt
plt.figure()  #创建一个绘图对象, 如果不创建直接调用plot, Matplotlib会直接创建一个绘图对象
plt.plot([2, 2, 3, 4])

plt.figure()
plt.plot([1,2,3],[-1,-2,-3])  # 默认为折线图

plt.ylabel('some numbers')
plt.xlabel('good')
plt.title("hello")

plt.show()

好看的颜色

'#9999ff'
color='fuchsia'

如何去除xy轴

plt.xticks(())
plt.yticks(())

坐标轴旋转一定角度

plt.xticks(rotation=270)
# 也可以自动旋转
fig=plt.figure()
fig.autofmt_xdate() #自动旋转xlabel

保存图片指定分辨率

plt.savefig("cm.jpeg",dpi = 600)

如何移动、隐藏坐标轴

##matplotlib画图初步,代码抄自莫凡大神,地址:
##https://morvanzhou.github.io/tutorials/data-manipulation/plt/2-3-axis1/
 
import matplotlib.pyplot as plt
import numpy as np
 
x=np.linspace(-3,3,50)
y1=2*x+1
y2=x**2
 
plt.figure(num=3,figsize=(5,6))
plt.plot(x,y2)
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.xlim((-1,2))
plt.ylim((-2,3))
plt.xlabel('x')
plt.ylabel('y')
 
plt.xticks(np.linspace(-1,2,5))
plt.yticks([-2,-1.8,0,1.5,3],\
         [r'$really\ bad$',r'$bad$',r'$normal$',r'$good$',r'$perfect$'])
 
ax=plt.gca()##获取坐标轴信息,gca=get current axic
ax.spines['right'].set_color('none')##设置右边框颜色为无
ax.spines['top'].set_color('none')
 
ax.xaxis.set_ticks_position('bottom')##位置有bottom(left),top(right),both,default,none
ax.yaxis.set_ticks_position('left')##定义坐标轴是哪个轴,默认为bottom(left)
 
ax.spines['bottom'].set_position(('data',0 ))##移动x轴,到y=0
ax.spines['left'].set_position(('data',0))##还有outward(向外移动),axes(比例移动,后接小数)
 
plt.show()

如何显示图片

import os
from PIL import Image
import matplotlib.pyplot as plt

img = Image.open(os.path.join('images', '2007_000648' + '.jpg'))

plt.figure("Image") # 图像窗口名称
plt.imshow(img)
plt.axis('on') # 关掉坐标轴为 off
plt.title('image') # 图像题目
plt.show()

绘图示例

折线图、曲线图(plot)

常用相关参数:

线的宽度:linewidth

线条样式:linestyle = ‘–’

线条颜色:color=‘green’

关键点的标记:marker = ‘<’

plot的第一个参数是x的范围,第二个是y的范围,二者元素个数要一致

import numpy as np
import matplotlib;matplotlib.use('TkAgg')
from matplotlib import pyplot as plt


x=np.linspace(-10,10,100)  # 生成等区间的数值,从-10开始到10,等分位100份,改小的话就变得不光滑
y=x**2
plt.plot(x, y, '-*r')  # 虚线, 星点, 红色,写-表示实线;--表示虚线;:表示虚点;
plt.show()

# 多线图
x = [0, 1, 2, 4, 5, 6]
y = [1, 2, 3, 2, 4, 1]
z = [1, 2, 3, 4, 5, 6]
plt.plot(x, y, '--*r', x, z, '-.+g')
plt.text(1, 2, "I'm a text")  #前两个参数表示文本坐标, 第三个参数为要添加的文本
plt.xlabel("x-axis")
plt.ylabel("y-axis")
plt.title("hello world")
plt.show()

# 分成两层
x = [0, 1, 2, 4, 5, 6]
y = [1, 2, 3, 2, 4, 1]
z = [1, 2, 3, 4, 5, 6]
plt.figure(1)
plt.subplot(211)  # subplot()函数指明numrows行数, numcols列数, fignum图个数. 图的个数不能超过行数和列数之积
plt.plot(x, y, '-+b')
plt.subplot(212)
plt.plot(x, z, '-.*r')
plt.show()

散点图(scatter)很美

常用相关参数:

颜色:c=‘r’ 红色

点大小:s=20 面积的关系

透明度:alpha=0.5 点多的地方颜色会变深

点形状:marker=‘o’ 圆形吗,可以去官网查看

大小:s

'''
查看相关性:正相关、负相关、不相关
'''
import numpy as np
import matplotlib; matplotlib.use('TkAgg')  # 这一行不写的话也挺好看的
import matplotlib.pyplot as plt

N=1000
x = np.random.randn(N)
y = np.random.randn(N)
colors = np.random.randn(N)
area = np.pi*(15*np.random.randn(N))**2  # 0 to 15 的点半径

plt.scatter(x,y,s=area,c=colors,alpha=0.5)
plt.show()

直方图(bar)

设置前景,背景颜色

plt.bar(x,y,facecolor='#9999ff',edgecolor='white')
import numpy as np
import matplotlib; matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

x = np.arange(10)
y = 2**x + 10
plt.bar(x,y,facecolor='#9999ff',edgecolor='white')
# va='bottom'显示在最大值横线上面,写成top显示在最大值横线下面
for x,y in zip(x,y):
    plt.text(x+0.4,y,'%.2f' % y,ha='center',va='bottom')

plt.show()

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib; matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

竖着两个直方图

# -*- coding: utf-8 -*-
import numpy as np
# import matplotlib; matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

# 直方图
N=5
y=[20,10,30,25,15]
index = np.arange(N)

# 或者写成p2 = plt.barh(x=0, bottom=index, width=y,height=0.5,orientation='horizontal')
x = np.linspace(-5, 5, 100)
y1 = 0.5 * x
y2 = x * x

plt.figure()
plt.xlabel('X axis...')
plt.ylabel('Y axis...')  # 设置坐标轴的文字标签

ax = plt.gca()  # get current axis 获得坐标轴对象

ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')  # 将右边 上边的两条边颜色设置为空 其实就相当于抹掉这两条边

ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')  # 指定下边的边作为 x 轴 指定左边的边为 y 轴

ax.spines['bottom'].set_position(('data', 0))  # 指定 data 设置的bottom(也就是指定的x轴)绑定到y轴的0这个点上
ax.spines['left'].set_position(('data', 0))



# 绘制水平条形图写上这个参数orientation='horizontal'
y_1=[20,10,30,25,15]
y_2=[-20,-10,-30,-25,-15]
plt.bar(x=0, bottom=index, width=y_1,height=0.5,orientation='horizontal')
plt.bar(x=0, bottom=index, width=y_2,height=0.5,orientation='horizontal')

plt.show()

柱状图(hist)

柱状图主要展现离散型数据分布

import numpy as np
import matplotlib; matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

# 直方图
mu=100
sigma=20  # 标准差
x=mu+sigma*np.random.randn(2000)
print(list(x))
plt.hist(x,bins=10,color='red',density=True)  # bins表示生成多少列
# density=True会将纵坐标变成频率除以组距
plt.show()

饼状图(pie)

常用相关参数:

autopct=’%.1f%%'表示显示每一块占的值

explode表示对应的区域距离圆中心的距离

shadow表示加上阴影

import matplotlib.pyplot as plt
import matplotlib; matplotlib.use('TkAgg')
# 饼状图
labels = 'A','B','C','D'
fracs = [15,30,45,10]
explode = [0,0,0.05,0]
plt.pie(x = fracs,labels = labels,autopct='%.1f%%',explode=explode,shadow=True)
plt.show()

箱型图(boxplot)

不是很常用

import numpy as np
import matplotlib; matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

# 箱型图
np.random.seed(100)
data = np.random.normal(size=1000, loc=0.0, scale=1.0)

# sym 调整异常值的形状  whis 代表虚线长度,是一个比例值
plt.boxplot(data,sym='o',whis=1.5)
plt.show()

# 多个箱型图
data = np.random.normal(size=(100, 4), loc=0.0, scale=1.0)
labels = ['A','B','C','D']
plt.boxplot(data, labels=labels)
plt.show()

#作业
np.random.seed(100)
data = np.random.normal(size=(100, 5), loc=0.0, scale=1.0)
labels = ['A','B','C','D','E']

plt.boxplot(data, labels=labels,sym='o',whis=1.25)
plt.show()

等高线图(contourf)

import matplotlib.pyplot as plt
import matplotlib; matplotlib.use('TkAgg')
import numpy as np

def f(x, y):  #生成高度
    return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2) 

x = np.linspace(-3,3,100)
y = np.linspace(-3,3,100)
# 在网格中的数据,生成网格点坐标矩阵,详情见https://blog.csdn.net/lllxxq141592654/article/details/81532855
X,Y = np.meshgrid(x,y)
# cmap表示颜色,8代表几条线
plt.contourf(X,Y,f(X,Y),8,alpha=0.75,cmap=plt.cm.hot)

# 添加文字描述
C = plt.contour(X,Y,f(X,Y),8,colors='black',linewidth=.5)
# inline=True是表示在线上添加,fontsize是字体大小
plt.clabel(C,inline=True,fontsize=10)

plt.xticks(())
plt.yticks(())
plt.show()

3D图(mpl_toolkits.mplot3d import Axes3D)

import matplotlib.pyplot as plt
import matplotlib; matplotlib.use('TkAgg')
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)

x = np.arange(-4,4,0.25)
y = np.arange(-4,4,0.25)
X,Y = np.meshgrid(x,y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

# rstride=1,cstride=1,一个表示色块的长,一个是宽。cmap是颜色,现在这是彩虹的颜色
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))
# 画一个3D图的映射,实际就是等高线图
ax.contourf(X,Y,Z,zdir='z',offset=-2,cmap='rainbow')
ax.set_zlim(-2,2)

plt.show()

动态图(animation.FuncAnimation)

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import animation
import matplotlib; matplotlib.use('TkAgg')

fig,ax = plt.subplots()

x = np.arange(0,2*np.pi,0.01)
line, = ax.plot(x,np.sin(x))

def animate(i):
    line.set_ydata(np.sin(x+i/10))
    return line,

def init():
    line.set_ydata(np.sin(x))
    return line,
# figure表示fig=fig,改变的函数func=animate,初始化函数init_func=init,二十毫秒interval=20
ani = animation.FuncAnimation(fig=fig,func=animate,init_func=init,interval=20)
plt.show()

两个Y轴数据

https://www.pianshen.com/article/6181481903/

修改坐标轴位置

https://www.jb51.net/article/172275.htm

图形美化

设置风格

import numpy as np
import matplotlib; matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

# 形状美化
fig, axes = plt.subplots(ncols=2, nrows=2)  # 生成一个两行两列的子图
ax1, ax2, ax3, ax4 = axes.ravel()

# 散点图
x = np.random.normal(size=100)
y = np.random.normal(size=100)
prop_cycle = plt.rcParams['axes.prop_cycle']
colors = prop_cycle.by_key()['color']  # 默认的画线颜色循环
ncolors = len(colors)
ax1.plot(x,y,'o')

# 柱状图
x=np.arange(0,10)
y=np.arange(0,10)
shift = np.linspace(0,10,ncolors)
for s in shift:
    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,color=colors[1])
ax3.bar(x+width*2,y3,width,color=colors[2])

i=0
for i in range(0,ncolors):
    xy=np.random.normal(size=2)
    ax4.add_patch(plt.Circle(xy,radius =0.3,color= colors[i]))
    # plt.Circle画圆,
    ax4.axis('equal')

plt.style.use('fivethirtyeight')  # ggplot也好看
# 展示的背景格式,有dark_background, bmh, grayscale, ggplot, fivethirtyeight
plt.show()

设置坐标轴标签,标题

plt.xlabel("x-axis")  # x轴标签
plt.ylabel("y-axis")  # y轴标签
plt.title("hello world")  # 设置标题

限制xy的范围,相当于截取图形了

plt.xlim((-1,2))
plt.ylim((-2,3))

设置xy轴精度

new_ticks = np.linspace(-2,2,11)
print(new_ticks)
plt.xticks(new_ticks)

用文字代替轴的数字

plt.yticks([-1,0,1,2,3],
           ['level1','level2','level3','level4','level5'])

坐标轴的颜色和样式

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3,100)
y1 = 2*x + 1
y2 = x**2

plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.plot(x,y2,color='blue',linewidth=5.0,linestyle='-')

new_ticks = np.linspace(-2,2,11)
plt.xticks(new_ticks)
plt.yticks([-1,0,1,2,3],
           ['level1','level2','level3','level4','level5'])

#gca get current axis  获取坐标轴
ax = plt.gca()

#把右边和上边的边框去掉
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

#把x轴的刻度设置为‘bottom’
#把y轴的刻度设置为‘left’
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
#设置bottom对应到0点
#设置left对应到0点
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))

plt.show()

添加图例

import matplotlib; matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import numpy as np

x=np.arange(1,11,1)
y=x*x
plt.plot(x,x*2,label='Normal')
plt.plot(x,x*3,label='Fast')
plt.plot(x,x*4,label='Faster')
# 参数 loc位置{0:'best',1:'右上角',2:左上角,3:'左下角',4:'右下角'} ncol 图例分为几列
plt.legend(loc=0,ncol=2)  # 显示图例的位置,不写默认为best
# plt.legend(bbox_to_anchor=(0,1,1,0.1),loc=3,ncol=3,mode="expand")
# 或者写plt.legend(['Normal','Fast','Faster'])
plt.show()

添加网格

import matplotlib; matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import numpy as np

y=np.arange(1,5)
plt.plot(y,y*2)
plt.title('666')
plt.grid(True)  # 打开网格选项,默认是不打开的
# color 颜色  linestyle 线型  linewidth 线宽
# plt.grid(True,color='g',linestyle='-',linewidth='2')
plt.show()

添加标注、文字注释、数学公式

import numpy as np
import matplotlib.pyplot as plt
import matplotlib; matplotlib.use('TkAgg')
# from matplotlib import font_manager
# # 中文字体准备
# my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/msyh.ttc")  # 设置字体为微软雅黑
# plt.xticks(barrage_type,fontproperties=my_font)

# 注释
x = np.arange(-10,11,1)
y = x*x
plt.plot(x,y)
# 'This is the bottom'是注释信息,xy是箭头坐标,xytext是这一行字的距离xt点的对应距离,即偏差
# arrowprops定义注释的格式,headlength表示箭头的长度,headwidth剪头的宽度,width长方形部分的宽度
plt.annotate('This is the bottom',xy=(0,1),xytext=(+10,-10),
             arrowprops=dict(facecolor='r',headlength=10,headwidth=20,width=10))
# 弧度是0.2,不加connectionstyle得到直线
plt.annotate('This is the bottom',xy=(0,1),xytext=(+30,-30),
             arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))
plt.show()


#文字,自带Tex引擎,以$符号为开头和结尾,还可以加入数学公式
x = np.arange(-10,11,1)
y = x*x
plt.plot(x,y)
# -2,40,表示文字位置。'function:y=x*x'表示文字内容
# family表示字体,fantasy这个好看,size字号,color颜色,style为斜体,normal为正常,weight为粗体,写成数字也行0-1000
# bbox外面画一个框框,alpha透明度0.2
plt.text(-2,40,
         'function:y=x*x',
         fontdict={'family'='serif','size'='20','color'='r','style'='italic','weight'='bold'},
         bbox=dict(facecolor='r',alpha=0.2))
plt.show()

一张图多个图形

'''
FigureCanva  画布对象
Figure  子图
Axes  坐标轴
'''
import matplotlib; matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import numpy as np

# 子图
x=np.arange(1,100)
plt.subplot(221) #子图的总行数,总列数,子图所在位置,按二维数组顺序排列,写成plt.subplot(2,2,1)也可以
plt.plot(x,x)

plt.subplot(222)
plt.plot(x,-x)

plt.subplot(223)
plt.plot(x,x*x)

plt.subplot(224)
plt.plot(x,np.log(x))
plt.show()


# 画大小不一的图表
plt.figure()
plt.subplot(2,1,1)  # 两行一列
plt.plot([0,1],[0,1])

plt.subplot(2,3,4)  # 两行三列,但是第一行已经被占了,因此是第四个位置
plt.plot([0,1],[0,1])

plt.subplot(235)
plt.plot([0,1],[0,1])

plt.subplot(236)
plt.plot([0,1],[0,1])

plt.show()

同时生成多张图

import matplotlib; matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

# 多图(同一时间生成多张图)
fig1=plt.figure()
ax1=fig1.add_subplot(111)
ax1.plot([1,2,3],[3,2,1])

fig2=plt.figure()
ax2=fig2.add_subplot(111)
ax2.plot([1,2,3],[1,2,3])

plt.show()

颜色和样式

import numpy as np
import matplotlib; matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

#调整颜色
'''
y=np.arange(1,5)
plt.plot(y,'y');
plt.plot(y+1,color=(0.1,0.2,0.3));
plt.plot(y+2,'#FF00FF');
plt.plot(y+3,color='0.5')  # 只写数字,显示灰度,数字大小代表颜色有多深
plt.show()
color={
'b':'blue','g':'green','r':'red','c':'cyan','m':'magenta','y':'yellow','k':'black','w':'white'
}
'''

# 点的形状
'''
y=np.arange(1,5)
plt.plot(y,'o');
plt.plot(y+1,'D');
plt.plot(y+2,'^');
plt.plot(y+3,'s');
plt.plot(y+4,'p');
plt.plot(y+5,'x');
plt.show()
'''

# 线型
'''
y=np.arange(1,5)
plt.plot(y,'--')  # 虚线
plt.plot(y+1,'-.')  # 点画线
plt.plot(y+2,':')  # 点线
plt.show()
'''

y=np.arange(1,5)
plt.plot(y,'cx--')
plt.plot(y+1,'kp:')
plt.plot(y+2,'mo-.')
plt.show()

进阶

三种方式画图

'''
三种方式简介
pyplot:经典高层封装,到目前为止,我们所用的都是
pylonlab:将 Matplotlib、numPy合并的模块,模拟 Matlab的编程环境
面向对象的方式: Matplotlib的精髓,更基础和底层的方式

三种方式优劣
pyplot:简单易用,交互使用时方便,可以根据命令实时作图。但底层定制能力不足。
pylab:完全封装,环境最接近 Matlab。不推荐使用。
面向对象( Object-Oriented)的方式:接近Matplot1ib基础和底层的方式,难度稍大,但定制能力强而且是Matplotlib的精髓。
总结:实战中推荐,根据需求,综合使用 pyplot和OO的方式,显示导入numpy
常用模块导入代码:
import matplotlib pyplot as plt
import numpy as np
'''
#pyplot
import matplotlib.pyplot as plt
import matplotlib; matplotlib.use('TkAgg')
import numpy as np
x=np.arange(0,10,1)
y=np.random.randn(len(x))
plt.plot(x,y)
plt.title('pyplot')
plt.show()

#pylab
from pylab import *
x=arange(0,10,1)
y=randn(len(x))
plot(x,y)
title('random numbers')
show()

#Object Oriented
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10,1)
y=np.random.randn(len(x))
fig=plt.figure()  # 生成一个画布figure对象
ax=fig.add_subplot(111)  # 在画布上生成坐标轴对象
l,=plt.plot(x,y)  # 画图
t=ax.set_title('object oriented')  # 写标题
plt.show()

添加多个坐标轴

import numpy as np
import matplotlib; matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

# 添加一个坐标轴,形成双坐标轴
x = np.arange(2,20,1)
y1 = x*x
y2 = np.log(x)
plt.plot(x,y1)
# plt.twinx()  # 添加坐标轴,默认是从0到1,添加一个纵轴
# plt.plot(x,y2,'r')
# plt.show()

plt.plot(x,y1)
plt.twiny()  # 添加一个横轴
plt.plot(y2,x,'r')
plt.show()

指定区域填充颜色

import numpy as np
import matplotlib; matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

# 区域填充
x = np.linspace(0,5*np.pi,1000)

y1 = np.sin(x)
y2 = np.sin(2*x)
plt.xticks([0,np.pi/2,np.pi,np.pi*3/2,2*np.pi],[r'$0$',r'$\pi/2$',r'$\pi$',r'$\pi*3/2$',r'$\pi*2$'])
# plt.plot(x,y1)  # 写上了会显示线的轮廓
# plt.plot(x,y2)
plt.fill(x,y1,'b',alpha=0.3)  # 有了透明度好看
plt.fill(x,y2,'r',alpha=0.3)
plt.show()

绘制图形

import numpy as np
import matplotlib; matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import matplotlib.patches as mpaches  # 用来画图形

# 形状

fig,ax = plt.subplots()  #生成一个图,可以绘制子图的

xy1 = np.array([0.2,0.2])  # 圆心的坐标
xy2 = np.array([0.1,0.4])  # 左下角点的位置
xy3 = np.array([0.5,0.2])  # 圆心
xy4 = np.array([0.5,0.45])  # 圆心

circle = mpaches.Circle(xy1,0.05)  # 圆形
rect = mpaches.Rectangle(xy2,0.2,0.1,color='r') # 长 宽。长方形
polygon = mpaches.RegularPolygon(xy3,5,0.1,color='g') # 边数 半径长度。等边五边形
eclipse = mpaches.Ellipse(xy4,0.2,0.1,color='y') #长直径 宽直径。椭圆

ax.add_patch(circle)  # 把circle放到图形上去
ax.add_patch(rect)
ax.add_patch(polygon)
ax.add_patch(eclipse)

plt.axis('equal')  # 防止画出来的图形变形
plt.grid()  # 加上网格
plt.show()

综合实例

绘制函数积分图

import numpy as np
import matplotlib.pyplot as plt
import matplotlib; matplotlib.use('TkAgg')
from matplotlib.patches import Polygon

# 函数积分图
def func(x):
    return -(x-2)*(x-8)+40

x = np.linspace(0, 10)
y = func(x)

fig, ax = plt.subplots()
plt.plot(x, y, 'r', linewidth=2)  # 画一个折线图
a=2
b=9
ax.set_xticks([a, b])  # 设置x坐标轴
ax.set_yticks([])
# ax.set_xticklabels([r"$a$", r"$b$"])  # 不写这句话会显示2和9,$a$是显示数学公式类型的字符

ix = np.linspace(a, b)
iy = func(ix)
ixy = zip(ix, iy)
verts = [(a, 0)] + list(ixy) + [(b, 0)]

poly  = Polygon(verts, facecolor='0.9', edgecolor='0.5')  # 生成多边形
ax.add_patch(poly)  # 把多边形添加进去

plt.figtext(0.89, 0.08, r"$x$")  # 在图的某个位置写上x和y
plt.figtext(0.1, 0.85, r"$y$")

x_math = (a + b) * 0.5
y_math = 35
ax.text(x_math, y_math, r"$\int_a^b (-(x-2)*(x-8)+40)dx$", fontsize=14, horizontalalignment='center')

# plt.ylim(ymin=30)
plt.show()

绘制极坐标

import numpy as np
import matplotlib; matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

# 极坐标
r=np.arange(1, 6, 1)
theta =[0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi]  # 生成角度
ax=plt.subplot(111, projection ='polar')  # projection表示投影为极坐标
ax.plot(theta, r, color ='r', linewidth=3)  # linewidth宽度
ax.grid(True)
plt.show()

绘制正弦函数

import matplotlib.pyplot as plt
import matplotlib; matplotlib.use('TkAgg')
import numpy as np
a=eval(input('输入a:'))
b=eval(input('输入b:'))
c=eval(input('输入c:'))
d=eval(input('输入d:'))
x = np.linspace(c*np.pi,2/b*np.pi+c**np.pi,1000)
print(list(x))
y = a*np.sin(x)+d
print(list(y))
plt.plot(x,y)
plt.show()

绘制带坐标轴的反比例函数

import numpy as np
import matplotlib;matplotlib.use('TkAgg')
from matplotlib import pyplot as plt
import mpl_toolkits.axisartist as axisartist


#创建画布
fig = plt.figure(figsize=(8, 8))
#使用axisartist.Subplot方法创建一个绘图区对象ax
ax = axisartist.Subplot(fig, 111)
#将绘图区对象添加到画布中
fig.add_axes(ax)
#通过set_visible方法设置绘图区所有坐标轴隐藏
ax.axis[:].set_visible(False)
#ax.new_floating_axis代表添加新的坐标轴
ax.axis["x"] = ax.new_floating_axis(0,0)
#给x坐标轴加上箭头
ax.axis["x"].set_axisline_style("->", size = 1.0)
#添加y坐标轴,且加上箭头
ax.axis["y"] = ax.new_floating_axis(1,0)
ax.axis["y"].set_axisline_style("-|>", size = 1.0)
#设置x、y轴上刻度显示方向
ax.axis["x"].set_axis_direction("top")
ax.axis["y"].set_axis_direction("right")


x = np.linspace(0.2, 5, 100)
y = 1/x
plt.plot(x,y)
plt.plot(-x,-y)
plt.show()

你可能感兴趣的