Matplotlib Python画图

【莫烦Python】Matplotlib Python 画图教程_哔哩哔哩_bilibili

基本用法(使用的是Jupyter Notebook)

%matplotlib inline
#%matplotlib inline 是一个magic command,用于 Jupyter Notebook 或 IPython 环境中。
#它的作用是使得 matplotlib 绘制的图形直接显示在代码单元下方,而不是弹出到单独的窗口中。
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-1,1,50)
y=2*x+1
plt.plot(x, y)# 绘制数据
plt.show()# 显示图形

matplotlib的图像都位于Figure对象中。你可以用plt.figure创建一个新的Figure

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-1,1,50)
y1=2*x+1
y2=x**2
plt.figure()
plt.plot(x, y1)

plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color="red",linewidth=1.0,linestyle="--")
#在同一图中绘制两条不同的线,并对其自定义
plt.show()

 

plt.figure(num=3, figsize=(8, 5))
#num=3: 图形编号 3 会被创建或更新。如果在代码中已经有编号为 3 的图形,它会被选中并更新。如果没有,它会创建一个新的图形。
#figsize=(8,5) 创建一个宽为8英寸,高为5英寸的图形

设置坐标轴

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-1,1,50)
y1=2*x+1
y2=x**2
plt.figure() 
plt.plot(x,y2)
plt.plot(x,y1,color="red",linewidth=1.0,linestyle="--")
plt.xlim((-1,1.25))#横坐标范围为-1~1.25
plt.ylim((-1,3.5))#纵坐标范围为-1~3.5
plt.xlabel("X")#横坐标命名为X
plt.ylabel("Y")#纵坐标命名为Y

plt.show()
np.linspace(start, stop, num)
#`start` 是起始值,`stop` 是终止值,`num` 是生成的数值个数

修改坐标轴

修改坐标轴刻度

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-1,1,50)
y1=2*x+1
y2=x**2
plt.figure() 
plt.plot(x,y2)
plt.plot(x,y1,color="red",linewidth=1.0,linestyle="--")
plt.xlim((-1,1.2))
plt.ylim((-1,3.2))
plt.xlabel("X")
plt.ylabel("Y")

new_ticks=np.linspace(-1,1.25,5)#生成-1到1.25之间的5个等间距的数值,用作 x 轴刻度。
plt.xticks(new_ticks)#设置 x 轴的刻度为 new_ticks
plt.yticks([-1,0,1,2,3],
          [r"$really\ bad$",r"$bad$",r"$normal$",r"$good$",r"$really\ good$"])
#设置 y 轴的刻度为 [-1, 0, 1, 2],并为每个刻度设置对应的标签
plt.show()

LaTeX 渲染在 Matplotlib 中的应用:

在 Matplotlib 中,你可以使用 LaTeX 语法来控制图形中的文本、坐标轴标签、标题等的显示格式。Matplotlib 会自动识别 LaTeX 语法并将其渲染为更优雅的数学公式或符号。

基本语法:

  • 用美元符号 $...$ 来包裹 LaTeX 数学公式。
r"$really\\alpha$" 
#r:表示原始字符串,防止 \ 被解析为转义字符。
#"$...$":用美元符号包裹的是 LaTeX 公式,会让内容在图形中按数学公式样式渲染。
#\\alpha:这里 \\ 是为了让 LaTeX 渲染 \alpha,而不是在字符串中解释为 \ 的转义符
r"$really\\alpha$" 在 matplotlib 中会渲染为:
really α

修改坐标轴原点

Python数据科学手册p241-242
ax=plt.gca()#gca() 代表 "Get Current Axes",即获取当前的坐标轴对象。如果当前没有坐标轴,它会自动创建一个新的坐标轴。
ax.spines["right"].set_color('none')#隐藏右侧坐标轴的线条
ax.spines['top'].set_color('none')#隐藏上侧坐标轴的线条
ax.xaxis.set_ticks_position('bottom')#设置 x 轴刻度线的位置为底部
ax.yaxis.set_ticks_position('left')#设置 y 轴刻度线的位置为左侧
ax.spines['bottom'].set_position(('data',0 ))#将底部坐标轴放置在y=0
ax.spines['left'].set_position(('data',0))#将左侧坐标轴放置在x=0
plt.show()

图例(Legend)

Python数据科学手册p221
line1,=plt.plot(x,y2,label='up')
line2,=plt.plot(x,y1,color="red",linewidth=1.0,linestyle="--",label='down')
plt.legend()#默认显示所有设置标签的线条的图例
plt.legend(handles=[line1,],loc="best")
#plt.legend()
handles=[]:选择显示哪一条线的图例
loc 参数指定图例的位置,通常选择loc="best"
title='My Legend':为图例设置标题。
fontsize=12:设置图例字体的大小。
shadow=True:给图例添加阴影效果。
frameon=False:关闭图例的边框。

箭头和注释

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-3,3,50)
y=2*x+1

plt.figure(num=1,figsize=(8,5)) 
plt.plot(x,y)

ax=plt.gca()
ax.spines["right"].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.spines['bottom'].set_position(('data',0 ))
ax.spines['left'].set_position(('data',0))

x0=1
y0=2*x0+1
plt.scatter(x0,y0,s=50,color='b')
plt.plot([x0,x0],[0,y0],'k--',lw=2.5)
#plt.plot() 用来绘制一条线。它接受两个主要的参数:x 和 y 数据。
#'k' 表示颜色,黑色。
#'--' 表示线型
#lw 是 linewidth 的缩写,用来设置线条的宽度。
plt.show()
plt.plot([x0,x0],[0,y0])
#[x0, x0] 是 x 轴的坐标。这意味着这条线的起始和结束的 x 坐标都是 x0,因此这条线是垂直的。
#[y0, 0] 是 y 轴的坐标,表示这条线从 (x0, y0) 到 (x0, 0),也就是从点 (x0, y0) 垂直下降到 y=0 位置。
[x0,x0],[y0,0]可以解读为向量相加的结果;
例,如果改为plt.plot([0,x0],[0,y0])
绘制出的线条即为向量(0,x0)和向量(0,y0)相加的结果
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-3,3,50)
y=2*x+1

plt.figure(num=1,figsize=(8,5)) 
plt.plot(x,y)

ax=plt.gca()
ax.spines["right"].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.spines['bottom'].set_position(('data',0 ))
ax.spines['left'].set_position(('data',0))

x0=1
y0=2*x0+1
plt.scatter(x0,y0,s=50,color='b')
plt.plot([x0,x0],[0,y0],'k--',lw=2.5)
plt.annotate(r'$2x=1=3$',#插入注释文本
             xy=(x0,y0),#注释的目标位置
             xycoords='data',#坐标单位为数据坐标
             xytext=(+30,-30),#注释文本相对于数据点(x0,y0)的偏移位置,30 个点向右、30 个点向下。
             textcoords='offset points',#注释文本的坐标为偏移点
            fontsize=16,#文本字体大小
             arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))
plt.show()
#arrowprops设置箭头样式
#arc3: 是连接样式的类型,表示使用三次贝塞尔曲线(arc3)来连接箭头和注释文本。arc3 表示连接线是一条弯曲的曲线。
#rad=.2: 是弯曲的程度,rad 的值控制曲线的“弯曲半径”。负值表示曲线朝着箭头的反方向弯曲。正值则使曲线朝着箭头的方向弯曲

设置注释或标签背景

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-3,3,50)
y=0.1*x

plt.figure() 
plt.plot(x,y,linewidth=10)
plt.ylim(-2,2)
ax=plt.gca()
ax.spines["right"].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.spines['bottom'].set_position(('data',0 ))
ax.spines['left'].set_position(('data',0))

for label in ax.get_xticklabels()+ax.get_yticklabels():# 遍历 X 和 Y 轴的标签
    label.set_fontsize(12)#字体大小设置为 12
    label.set_bbox(dict(facecolor='pink',edgecolor='None',alpha=0.5))
#每个标签的背景颜色为粉色,透明度(alpha=0.5)不显示边框颜色

plt.show()

散点图

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
n=1024
# 生成两个具有正态分布的随机数据:x 和 y
x=np.random.normal(0,1,n)# 平均值为 0,标准差为 1 的正态分布
y=np.random.normal(0,1,n)
t=np.arctan2(x,y)# 用于计算给定点 (x, y) 的反正切值,返回该点相对于原点的角度[-π, π],用于控制散点的颜色
plt.scatter(x,y,s=75,c=t,alpha=0.5)#s=75表示点的大小,c=t用t的值来指定颜色,alpha=0.5设置透明度
plt.xlim((-1.5,1.5))#x轴范围从-1.5到1.5
plt.ylim((-1.5,1.5))

plt.colorbar()#显示颜色条帮助解释颜色和角度之间的关系
plt.show()
#隐藏坐标轴
plt.xticks(())
plt.yticks(())
Python数据科学手册p208
​​​​​
n=12
X=np.arange(n)#一个包含整数的数组,即[0, 1, 2, ..., n-1],n是数组的长度表示总共有n个元素
Y1=(1-X/float(n))*np.random.uniform(0.5,1.0,n)
Y2=(1-X/float(n))*np.random.uniform(0.5,1.0,n)
#X/float(n) 将X中的每个元素除以n,并且将结果转换为浮点数,
#np.random.uniform(0.5, 1.0, n)会生成一个长度为n(即为12)的数组,
#数组中的每个元素是从 0.5 到 1.0 之间均匀分布的随机数。
plt.bar(X,Y1,facecolor='#9999ff',edgecolor='white')
plt.bar(X,-Y1,facecolor='#ff9999',edgecolor='white')
#条形的高度为Y1
#条形的填充颜色是浅蓝色(#9999ff)。
#每个条形的边框颜色是白色
#zip(X, Y1)将X数组(x坐标)和Y1数组(条形图的高度值)按元素一一配对
plt.text()#设置文本参数
#设置标签文本的坐标;x + 0.4:相较条形图向右偏移0.4,#y + 0.05:相较条形图向上偏移0.05,
#'%.2f' % y:将 y(即条形的高度值)格式化为保留两位小数的字符串,用作显示的文本。
#ha='center':文本的水平位置会根据你给定的x坐标居中显示(这里指x+0.4)
#va='bottom':文本的底部位置会对齐到指定的y坐标(这里指y+0.05)
for x,y in zip(X,Y1):
plt.text(x+0.4,y+0.05,'%.2f'%y,ha='center',va='bottom')
for x,y in zip(X,Y2):
plt.text(x+0.4,-y-0.05,'%.2f'%y,ha='center',va='top')

# 设置图形的显示范围
plt.xlim(-0.5,n)#x轴范围从 -0.5 到 n
plt.xticks(())# 去掉x轴的刻度
plt.ylim(-1.25,1.25)
plt.yticks(())
plt.show()

等高线图

Python数据科学手册p211

Python数据科学手册p214

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
def f(x,y):
    return(1-x/2+x**5+y**3)*np.exp(-x**2-y**2)
#np.exp(x):计算e的幂,x可以是一个标量(单个值)、数组或矩阵。对于数组,np.exp() 会对其中的每个元素都应用指数运算。
n=256
x=np.linspace(-3,3,n)
y=np.linspace(-3,3,n)
X,Y=np.meshgrid(x,y)
#np.meshgrid(x, y)将x和y的一维数组转换成二维网格坐标X和Y,它们分别包含了每个点的x和y坐标
plt.contourf(X,Y,f(X,Y),8,alpha=0.75,cmap=plt.cm.hot)
#8表示将图像的值分成8个区间来进行填充。
#f(X,Y)是函数值,计算了网格X,Y上每个点的函数值。
#alpha=0.75设置填充的透明度,0.75表示75%不透明。
#cmap=plt.cm.hot是一个渐变颜色映射,通常用于显示与热度、强度或其他量度相关的数据。其颜色从黑色到红色再到黄色和白色,这使得它可以用来表示温度等数据,数值越高,颜色越亮,
C=plt.contour(X,Y,f(X,Y),8,colors='black',linewidths=.5)

plt.clabel(C,inline=True,fontsize=10)
#设置等高线标签
plt.xticks(())
plt.yticks(())
# 隐藏坐标轴刻度
plt.show()
plt.clabel(contour, inline=False, fontsize=None, fmt='%1.3f', colors='black', **kwargs)
#contour: 这是 plt.contour() 或 plt.contourf() 返回的等高线对象。这个对象包含了所有的等高线信息,用于为它们添加标签。
#inline: 布尔值,默认值为 False。如果为 True,标签会被放置在等高线内,而不是放在它们外部。
#fontsize: 标签的字体大小。如果没有指定,默认使用当前字体大小。
#fmt: 用于格式化标签的字符串,可以使用标准的字符串格式化方法(例如 '%1.3f' 代表保留三位小数)。它控制标签文本的数值格式。
#colors: 标签文字的颜色,默认为 'black'。
#inline_spacing: 当 inline=True 时,控制标签与等高线之间的距离。
#use_clabels: 控制是否显示标签的其他选项,通常无需修改。
a = np.array([0.313660827978, 0.365348418405, 0.423733120134,
              0.365348418405, 0.439599930621, 0.525083754405,
              0.423733120134, 0.525083754405, 0.651536351379]).reshape(3,3)
#这行代码首先创建了一个包含9个数值的一维NumPy数组a,然后使用reshape(3, 3)将其转换为一个3x3的二维数组
plt.imshow(a,interpolation='nearest',cmap='bone',origin='upper')
#interpolation='nearest': "最近邻插值",意味着每个像素的值将是最接近的原始数据点的值(不进行平滑过渡,显示的边界很明显)
#cmap='bone': 设置颜色映射(colormap),'bone' 映射会将数组中的数值对应到特定的灰度级别
#origin='upper': 设置原点在图像的上方,即矩阵的第一个元素会出现在图像的顶部左侧。'lower' 则会将原点放置在图像的底部。
plt.colorbar(shrink=0.9)
#shrink 参数用于缩放颜色条的高度或宽度,将其设置为小于1的值,颜色条会缩小;如果设置为大于 1,则颜色条会放大
plt.xticks(())
plt.yticks(())
plt.show()

images_contours_and_fields example code: interpolation_methods.py — Matplotlib 2.0.2 documentation

3D图

from mpl_toolkits.mplot3d import Axes3D
fig=plt.figure()

ax = fig.add_subplot(111,projection='3d')
#fig.add_subplot() 是用来在 fig 图形对象中添加一个子图的函数。
#参数 111 代表子图的位置,可以拆解为:
#第一个数字 1 表示图形的行数(即图形总共有 1 行)。
#第二个数字 1 表示图形的列数(即图形总共有 1 列)。
#第三个数字 1 表示选择的子图编号(即第 1 个子图)。
#所以 111 其实表示一个 1x1 网格的第 1 个子图。
#默认情况下,Matplotlib创建的是二维图形,但通过将projection='3d'设置为 '3d',就能创建一个3D坐标系,从而能够绘制3D图形。
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)
#R = np.sqrt(X**2 + Y**2) 计算的是每个(X, Y)坐标点到原点(0, 0)的直线距离
Z=np.sin(R)
#Z = np.sin(R)使用这个距离值计算每个点的Z坐标,结果是一个基于距离的波浪型曲面。
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))
#plot_surface()用来绘制3D曲面,它接受三个参数:X,Y和Z表示3D空间中每个点的坐标。
#rstride和cstride控制网格的行和列,控制曲面的分辨率,影响绘制出来的图形的精度
ax.contourf(X,Y,Z,zdir='z',offset=-2,cmap='rainbow')
#zdir=‘’是指投影的方向;zdir='z'表示等高线将沿着z轴进行投影(即在 xy 平面上绘制等高线)
#offset=‘’指等高线图的投影偏移量;offset=-2 表示等高线图将被偏移到z=-2 的位置
ax.set_zlim(-2,2)
#设置z轴的范围(-2,2)
plt.show()
Python数据科学手册p257

简易网格子图

#method1
plt.figure()
ax1=plt.subplot2grid((3,3),(0,0),colspan=3,rowspan=1)
ax1.plot([1,2],[1,2])#画一条连接 [1, 2] 和 [1, 2]的线段
ax1.set_title('ax1_title')#设置标题
ax2=plt.subplot2grid((3,3),(1,0),colspan=2)
ax3=plt.subplot2grid((3,3),(1,2),rowspan=2)
ax4=plt.subplot2grid((3,3),(2,0))
ax5=plt.subplot2grid((3,3),(2,1))
plt.show()
plt.subplot2grid(shape, location, rowspan=1, colspan=1)
#shape:(nrows, ncols),表示整个图形的网格布局,即有多少行 (nrows) 和多少列 (ncols)。
#location:(row, col),表示子图放置的起始位置,row 是行号,col 是列号。行和列都是从 0 开始计数的。
#rowspan: 指定子图跨越的行数,默认为1。
#colspan: 指定子图跨越的列数,默认为1
#method2
import matplotlib.gridspec as gridspec
plt.figure()
gs=gridspec.GridSpec(3,3)#创建一个3x3的网格布局
ax1=plt.subplot(gs[0,:])#创建第一个子图,跨越第1行的所有三列
ax2=plt.subplot(gs[1,:2])#第二行前两列
ax3=plt.subplot(gs[1:,2])#第二三行第三列
ax4=plt.subplot(gs[-1,0])#倒数第一行(第三行)第一列
ax5=plt.subplot(gs[-1,-2])#倒数第一行,倒数第二列
plt.show()
#method3
fig,((ax11,ax12),(ax21,ax22))=plt.subplots(2,2,sharex=True,sharey=True)
#创建一个2x2的子图布局,即两行两列的子图,返回一个fig和4个子图 (ax11, ax12, ax21, ax22)。
#sharex=True和sharey=True表示这些子图将共享x轴和y轴。即所有子图的 x 轴和 y 轴的刻度和范围是相同的。
#这行代码使用了双层语法将返回的子图对象赋给了ax11, ax12, ax21, ax22
ax11.scatter([1,2],[1,2])
#[1, 2]是x轴的数据点。[1, 2]是 y 轴的数据点。两个点分别位于坐标(1, 1)和(2, 2)

plt.tight_layout()
#自动调整子图之间的间距
plt.show()
Python数据科学手册p233

图中图

fig=plt.figure()
x=[1,2,3,4,5,6,7]
y=[1,3,4,2,5,8,6]
#定义x和y数据。这些数据将在图上绘制为一条红色的折线。
left,bottom,width,height=0.1,0.1,0.8,0.8
#这里的 left, bottom, width, height是相对于图形区域的比例。具体来说:
#left = 0.1:子图距离图形左边缘的距离占总宽度的 10%。
#bottom = 0.1:子图距离图形下边缘的距离占总高度的 10%。
#width = 0.8:子图的宽度占图形总宽度的 80%。
#height = 0.8:子图的高度占图形总高度的 80%。
ax1=fig.add_axes([left,bottom,width,height])
#通过fig.add_axes()将子图ax1添加到图形fig中。这里[left, bottom, width, height] 是一个包含4个值的列表,用于指定子图的位置和大小。
ax1.plot(x,y,'r')
#绘制一条红色的线图
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_title('title')

left,bottom,width,height=0.2,0.6,0.25,0.25
ax2=fig.add_axes([left,bottom,width,height])
ax2.plot(x,y,'b')#绘制一条蓝色的线
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_title('title inside 1')

#第二种添加子图的方式
plt.axes([.6,0.2,0.25,0.25])
plt.plot(y[::-1],x,'g')
#[::-1] 所有元素逆序
plt.xlabel('x')
plt.ylabel('y')
plt.title('title inside 2')

plt.show()
Python数据科学手册p230

次坐标轴

x=np.arange(0,10,0.1)
y1=0.05*x**2
y2=-1*y1

fig,ax1=plt.subplots()
ax2=ax1.twinx()
#twinx()绘制一个新的子图,与ax1共享x轴。即在同一个图形中绘制两个不同y轴的数据,而x轴的刻度是共享的。
ax1.plot(x,y1,'g-')
ax2.plot(x,y2,'b--')

ax1.set_xlabel('X data')
ax1.set_ylabel('Y1',color='g')
ax2.set_ylabel('Y2',color='b')

plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值