matplotlib学习笔记

python 复制代码
import matplotlib as plt
plt.plot([1,2,3,4,5],[1,2,3,4,5])#传入的是所有坐标点的x坐标,还有就是y坐标
plt.plot([1,2,3,4,5],[1,4,9,16,25],'--',color='b') #'--'代表第二个线用--的方式绘制,color就是线条颜色
plt.xlabel('xaxis','--')  #x轴的名称是xaxis,这里可以根据自己需要更改,'--'是线条形状
plt.ylabel('yaxis',fontsize=10)  #y轴名称,可以通过fontsize设置字体大小也就是ylabel的大小
plt.show()

上面的代码绘制了两幅图片,第一个绘制的就是一条直线,第二条直觉上是二次函数,但是没有画出来二次函数的感觉,点和点之间也是用直线来绘制的。同时在绘制的时候也不需要考虑图像的大小,matplotlib会自动调整好对应图像的大小。同时指定color和指定线条的形状可以合并为一个字符串即采用下面这种方式,当然k是black的缩写,注意这里颜色只能用缩写。

python 复制代码
plt.plot([1,2,3,4,5],[1,4,9,16,25],'--k')#

绘制多个图形的时候不用写多个plt.plot(),也就是说可以这么画图:

python 复制代码
plt.plot([1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,4,9,16,25],'--k')

跟上面画出来的效果是一样的。

使用linewidth来控制线条的宽度

使用marker来控制我们传入点的展示形式

使用markerfacecolor来控制传入点的颜色

alpha控制线条的透明度(实际上就是线条颜色的深浅)。

如果我们之前使用plt设置了一些点,我们现在想该他的格式比方说

python 复制代码
import matplotlib.pyplot as plt
a=plt.plot([1,2,3,4,5],[1,2,3,4,5],'--',color='red')#传入的是所有坐标点的x坐标,还有就是y坐标
plt.plot()#
plt.xlabel('xaxis')
plt.ylabel('yaxis',fontsize=10)
plt.setp(a,alpha=0.5,linewidth=2,marker='o',markerfacecolor='white',color='black')#更改之前的对象
plt.show()

有的时候我们想要在一个图里面进行对比,这就需要我们把很多图放在一个途中,此时我们可以调用subplot的操作进行绘制

python 复制代码
x=np.arange(0,10,1) 
y=np.sin(x)
plt.subplot(211)   #211,代表一个图里面有两行1列,下面要画第一个图也就是第一行的图
plt.plot(x,y,color='black') 
plt.subplot(212)   #212 是第二个图
plt.plot(x,y,color='red')
plt.show()

有的时候我们想在途中突出一些东西(最高值或者最低值),我们需要在途中对某个点进行标注。

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
x=np.arange(0,10,1)
y=(x-2)**2
plt.plot(x,y,color='green')
plt.grid(True)   #在坐标系绘制网状格子
plt.text(2,0,'small')  #标注信息,在(2,0)附近添加一个small的注释
plt.annotate('small',xy=(2,0),arrowprops=dict(color='red',shrink=0.05,headwidth=10,headlength=10)) 
#箭头强调,arrowprops就是对这个箭头的设置,width宽度,length长度,但是本土箭头没空间了
plt.show()

matplotlib也提供了多种绘图风格供我们使用

python 复制代码
x=np.arange(0,10,1)
y=(x-2)**2
print(plt.style.available) #查看有什么风格是可以使用的
plt.style.use('_mpl-gallery')  #使用特定的风格
plt.plot(x,y)
plt.show()

看看效果吧:


matplotlib也提供了条形图的画法:

python 复制代码
x=np.arange(0,10,1)
y=(x-2)**2
fig,ax=plt.subplots(ncols=2)  #这里只是指明了一行两个子图
v_bars=ax[0].bar(x,y,color='red')  #默认情况下目标值是垂直的
h_bars=ax[1].barh(x,y,color='blue') #h代表horizon水平的目标值是水平的
ax[0].axhline(5,color='black',linewidth=2) #在对应的图中画一个水平的线
ax[1].axvline(5,color='black',linewidth=2) #在对应的图中画一个竖直的线
plt.show()

那如果想让画出的线下面的条状图和上面的条状图有区别可以这么写代码。

python 复制代码
for bar,height in zip(v_bars,y): #这里的bar就是图中的条状图,y就是我们之前的目标值
    if height<5:  #如果高度也就是对应的y小于线对应的值
        bar.set_color('red')  #设置一个颜色
    else:
        bar.set_color('green')
plt.show()

你也可以试试水平朝向的设置bar的值。

如果我们想在两条线段包围的区域填充一些颜色可以使用如下的方法:

python 复制代码
ax.fill_between(x, y1, y2, color='red') #在y1和y2之间填充红色,不填默认为0
#----------------------------------下面是一个示例
x=np.arange(0,10,1)
y=(x-2)**2-5
print(plt.style.available) 
plt.style.use('_mpl-gallery')  
plt.plot(x,y)
plt.fill_between(x,y,color='lightblue')
plt.show()

使用matplotlib我们可以让条状图的信息更加丰富一些

python 复制代码
mean_values=[1,2,3]  #代表每个样本的平均值
variance=[0.2,0.3,0.4] #代表每个样本的方差
bar_label=['bar1','bar2','bar3']  #每个样本的名称
x_pos=list(range(len(bar_label)))  #每个样本的x坐标用来区别
plt.bar(x_pos,mean_values,yerr=variance)  #画出对应的直方图
max_y=max(zip(mean_values,variance))  #获得最大值
plt.ylim([0,(max_y[0]+max_y[1])*1.2])  #让y轴纵坐标可以显示所有的条状图
plt.ylabel('variable y')   
plt.xticks(x_pos,bar_label)  #设置x轴每个下标的名称就是横坐标原来是1,现在是bar1
plt.show()

效果图:

如果我有两个数据都想用直方图显示怎么办呢,可以考虑用下面的结构:

python 复制代码
#这种结构要求值得符号必须一样
x1=np.array([4,2,3]) 
x2=np.array([3,4,1])
y=range(len(x1)) 
plt.barh(y,x1,color='b') 
plt.barh(y,-x2,color='r') #弄成负数去显示
plt.show()

效果:

那假如我有很多组数据呢,可以考虑用下面的方法:

python 复制代码
y1=np.array([4,2,3])
y2=np.array([3,4,1])
y3=np.array([3,6,8])#对应的三组数据
x=np.array([0,1,2])#第一组的x坐标
width=0.2  #每个条状图的宽度
const_val=0.5  #透明度(就是调节亮度的)
plt.bar(x,y1,color='r',alpha=const_val,width=width) #第一个条状图的x
plt.bar([t+width for t in x],y2,color='g',alpha=const_val,width=width) #跳过一个width也就是
#一个条状图的宽度
plt.bar([t+2*width for t in x],y3,color='b',alpha=const_val,width=width)#跳过两个width
plt.show()

运行结果:


我们可以之前学的试着画一个比较详细的直方图

python 复制代码
x=np.arange(100,125,5)
y=range(len(x))
y_labels=['a','b','c','d','e']
bar=plt.barh(y,x,color='b')
plt.yticks(y,y_labels)
mn=min(x)
for bar,x in zip(bar,x):
    print(bar.get_width()) #获取直方图的宽度,就是在x轴上面占多长
    print(float(bar.get_y())) #获取每个条状图最靠下部分的值,比如说第一是-0.4,因为希望中央在#0,同时总长度是0.8,所以最下面的那一部分是-0.4
    print(bar.get_height())  #获取条状图在y轴上的长度,这里我们是水平画的所以都是0.8
    plt.text(bar.get_width()+bar.get_width()*0.05,bar.get_y()+bar.get_height()/2,f"{(x/mn)  * 100:.2f}%") #那么这个标注就很明白了,就是在每个条状图顶部中间加上一个是最小的多少倍
plt.xlim([0,150])
plt.ylim([-1,5])
plt.vlines(mn,-1,max(y)+1,color='k',linestyle='--')
plt.show()

如果我们条形图是上升趋势,然后我们想用一种渐变色来表示这种趋势,我们就可以使用下面的代码。

python 复制代码
import matplotlib.pyplot as plt
import matplotlib.colors as col
import matplotlib.cm as cm
mean_values=range(0,18)
x_pos=range(len(mean_values))
cmap1=cm.ScalarMappable(col.Normalize(min(mean_values),max(mean_values),cm.hot))#指定一种渐
#变色
cmap2=cm.ScalarMappable(col.Normalize(0,20,cm.hot))#前两个值可以自己指定
plt.subplot(121)
plt.bar(x_pos,mean_values,color=cmap1.to_rgba(mean_values))
plt.subplot(122)
plt.bar(x_pos,mean_values,color=cmap2.to_rgba(mean_values))
plt.show()

如果想让条形图里面填充自己想要的符号

python 复制代码
import matplotlib.pyplot as plt
y=[3,2,9,6,5]
x=range(len(y))
pattern=['x','\\','//','.','o']  #设置填充格式
bars=plt.bar(x,y) 
for bar,pattern in zip(bars,pattern):
    bar.set_hatch(pattern)
plt.show()

matplotlib绘制盒图

首先这里阐明一下盒图的用处

①:通过盒图,可以观察数据是否呈现偏态,帮助分析人员判断数据是否符合正态分布。

②:盒图能够直观地展示数据的中位数、上下四分位数及最大值和最小值,从而帮助理解数据的分布形态。

③:盒图可以帮助识别数据中的异常值(即离群值),这些值通常被表示为单独的点。

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
data=[np.random.normal(0,std,100) for std in range(1,4)]#生成三组满足(0,std)的正态分布
fig=plt.figure(figsize=(8,6)) #图行大小
plt.boxplot(data,notch=False,sym='s',vert=True) #传入的参数的含义依次是:传入的数据、是否有缺口、离群点的表示形势、是否垂直放置
plt.xticks(range(1,len(data)+1),[f'x{i}' for i in range(1,4)])
plt.show()

小提琴图:

通过小提琴图,可以很快的得知数据的具体分布情况(哪里分布多,哪里分布较少),同时也可以知道数据的中位数以及上下限(方便判断离群点)。

python 复制代码
data=[np.random.normal(0,std,100) for std in range(1,4)]#生成三组满足(0,std)的正态分布
fig=plt.figure(figsize=(8,6)) #图行大小
plt.violinplot(data,showmedians=True) #是否标记中位数
plt.xticks(range(1,len(data)+1),[f'x{i}' for i in range(1,4)])
plt.show()

通过这两个操作可以把对应的顶部和右边的边界去掉

python 复制代码
data=[np.random.normal(0,std,100) for std in range(1,4)]#生成三组满足(0,std)的正态分布
fig=plt.figure(figsize=(8,6)) #图行大小
ax=plt.subplot(111)
plt.violinplot(data,showmedians=True) #是否标记中位数
plt.xticks(range(1,len(data)+1),[f'x{i}' for i in range(1,4)])
ax.spines['top'].set_visible(False)#隐藏顶部的边界
ax.spines['right'].set_visible(False)#隐藏右边的边界
plt.show()
python 复制代码
plt.xticks(range(1,len(data)+1),[f'x{i}' for i in range(1,4)],rotation=45)#可以x1设置旋转角度

import matplotlib.pyplot as plt
import numpy as np
x=np.arange(10)
for i in range(1,4):
    plt.plot(x,i*x**2,label=f"Group {i}")  #label代表这条线的实际含义
plt.legend(loc="best")  #legend代表显示每条线对应的含义,loc代表放在图片的哪个位置
plt.show()

如果想让对应的 提示信息框在外面可以这样写

plt.legend(loc="upper center",bbox_to_anchor=(0.5,1.15),ncol=3)#bbox代表放在哪个位置,ncol=3代表3个group并排写,loc代表和当前图片居中

如果我们实在想把对应的标签放在右上角,那么我们就可以设置对应的标签的透明度,比如下面的

plt.legend(loc='upper right',framealpha=0.01)#设置标签透明度

x=np.random.randint(0,40,1000)
print(np.bincount(x))
plt.hist(x,bins=40,edgecolor='white',color='orange')#绘制的直方图显示的是每个值出现了几次,edgecolor代表每个条状图之间用什么分割(不然就连在一块了),color代表每个柱的内部颜色是什么
plt.show()

bins代表的是把这个数值区间我分成几份来表示(下图就是每个值对应一份).

如果设置bins=2


matplotlib绘画散点图

x_coords=[0.13,0.22,0.39,0.59,0.68,0.74,0.93]
y_coords=[0.75,0.34,0.44,0.52,0.80,0.25,0.55]
plt.figure(figsize=(8,6))
plt.scatter(x=x_coords,y=y_coords,s=10) #s代表每个点的面积
for x,y in zip(x_coords,y_coords):  
    plt.annotate(f"{x,y}",xy=(x,y),xytext=(0,-15),textcoords='offset points',ha='center')#xytext代表这个文本的相对位置,然后textcoords='offset points'就是相对绘制的我们给的(x,y)来说的偏移,指明xytext是相对于谁来说的,ha代表怎么对齐
plt.show()
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure()
ax=fig.add_subplot(111,projection='3d') #画三维图
theta = np.linspace(-4*np.pi, 4*np.pi, 100) 
z=np.linspace(-2,2,100) 
r=z**2 
x=r*np.sin(theta) 
y=r*np.cos(theta) 
ax.plot(x,y,z) 
plt.show()

3D绘制条形图

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

for c, z in zip(['r', 'g', 'b', 'y'], [30, 20, 10, 0]): 
    xs = np.arange(20)  
    ys = np.random.rand(20)  
    print(ys.shape)
    cs = [c] * len(xs) 
    ax.bar(xs, ys, zs=z, zdir='y', color=cs, alpha=0.5) #zs就是条形图在z轴哪个坐标下,zdir就是条形图向哪个方向延申。

plt.show()
相关推荐
_不会dp不改名_2 分钟前
HCIA笔记3--TCP-UDP-交换机工作原理
笔记·tcp/ip·udp
-一杯为品-39 分钟前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
风尚云网1 小时前
风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计
前端·css·学习·html·html5·风尚云网
熙曦Sakura2 小时前
完全竞争市场
笔记
EterNity_TiMe_3 小时前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
sanguine__3 小时前
java学习-集合
学习
lxlyhwl3 小时前
【STK学习】part2-星座-目标可见性与覆盖性分析
学习
nbsaas-boot3 小时前
如何利用ChatGPT加速开发与学习:以BPMN编辑器为例
学习·chatgpt·编辑器
dr李四维3 小时前
iOS构建版本以及Hbuilder打iOS的ipa包全流程
前端·笔记·ios·产品运营·产品经理·xcode
CV学术叫叫兽4 小时前
一站式学习:害虫识别与分类图像分割
学习·分类·数据挖掘