python3 Matplotlib 数据分析/设置图例、标签,添加注解,设置坐标轴的范围、刻度、标签/散点图/柱形图/等高线图


Matplotlib是python内置的一个非常强大的数据分析工具,可用来绘图。下面是我对Matplotlib使用的一系列练习,包括利用数据绘线、设置图例、设置标签、修改坐标轴、添加标注、绘制散点图、柱形图、等高线图,每个示例代码都配有详细的注释。下来一起来看看吧

1.基本用法:利用numpy库生成数据,使用Matplotlib下的pyplot子库绘制图形

# 导库
import matplotlib.pyplot as plt
import numpy as np

# 利用 numpy 生成数据
x = np.linspace(-3,3,50)
y1 = 2 * x + 1
y2 = x**2

# 绘图
# 设置图形窗口
plt.figure()
# 以x为横坐标,y1为纵坐标绘图
plt.plot(x, y1)

# 设置图形窗口
plt.figure(num=3)
# 以x为横坐标,y2、y1为纵坐标,即绘制两条线
plt.plot(x, y2)
# 设置绘制的线为红色、虚线,线的宽度为1
plt.plot(x, y1 ,color='red' ,linestyle = '--', linewidth = 1.0)

# 将绘制的图形显示出来
plt.show()

以上的代码运行的效果如下:
在这里插入图片描述
在这里插入图片描述

2.坐标轴修改:包括图例、坐标轴的标签、位置、范围、刻度等

# 导库
import matplotlib.pyplot as plt
import numpy as np

# 利用numpy生成数据
x = np.linspace(-3,3,50)
y1 = 2*x+1
y2 = x**2

# 在一张图中绘制两条直线
# plt.figure(figsize=(8,8))
plt.plot(x,y1,color = 'red', linestyle = '--')
plt.plot(x,y2)

# 设置x,y轴的范围。lim的含义为limit
plt.xlim((-1,6))
plt.ylim(-2,10)

# 设置x,y轴的标签
plt.xlabel('time')
plt.ylabel('altitude')

# 设置x,y轴的刻度,并在某刻度点上设置文字描述 
new_ticks = np.linspace(-1,2,5) # ticks可以理解成刻度
print(new_ticks)
plt.xticks(new_ticks)
# 设置-2点为really bad,0点为normal,5点为good,10点为really good
plt.yticks([-2,0,5,10],
    [r'$really\ bad$',r'$normal$',r'$ good$',r'$really\ good$'])# $ $为LATEX公式表达式,中间可写公式

plt.show()

运行效果如下:
在这里插入图片描述

plt.plot(x,y1,color = 'red', linestyle = '--',label= 'linear')
plt.plot(x,y2 , label = 'nonlinear')

# 设置图例
plt.legend(loc = 'best',labels = ['a','b'])


# x,y轴的范围

plt.xlim((-1,6))
plt.ylim(-2,10)

# 设置x,y轴的标签
plt.xlabel('time')
plt.ylabel('altitude')

# 设置x,y轴的刻度,并在某刻度点上设置文字描述 
new_ticks = np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks)
plt.yticks([-2,0,5,10],
    [r'$really\ bad$',r'$normal$',r'$ good$',r'$really\ good$'])# $ $为LATEX公式表达式,中间可写公式

# 修改坐标轴的位置
# gca='get current axis'
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 设置xy坐标轴
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')

# 移动坐标轴
ax.spines['bottom'].set_position(('data',0)) #将X轴移动到y=0的位置
ax.spines['left'].set_position(('data',0)) #将y轴移动到x=0的位置

plt.show()

运行效果如下:
在这里插入图片描述

3.添加注解

# 倒库
import matplotlib.pyplot as plt
import numpy as np

# 使用numpy生成数据
x = np.linspace(-4,4,20)
y = 2*x+1

# 绘线,由于要避免坐标轴的标签被图形掩盖,这是设置图形的图层即zorder为0
plt.plot(x,y,linewidth=10,zorder = 0)

# 移动坐标轴的位置
ax = plt.gca()

# 将图形的窗口的上方的线和右方的线设置为none
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 设置xy轴,方便后续移动
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
# 移动,x,y轴的移动是互相以对方作为参考的
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))

# 注解
x0 = 1
y0 = 2*x0+1
# 在图中绘出一个点
plt.scatter(x0,y0)

# 画直线
#(x0,x0),(y0,0)的含义是两个连线点的横坐标放在一块,纵坐标放在一块
plt.plot((x0,x0),(y0,0),linestyle = '--',color='r') 
plt.annotate(r'$2x+1=%s$' %y0,xy=(x0,y0),xycoords='data',xytext=(+30,-30),textcoords='offset points',
fontsize=16,arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2')) #xytext为注释的坐标点的位置


# 注释的方法二
plt.text(-4.7,3,r'$This\ is\ content.\ \alpha_i $',fontdict={
    
    'size':16,'color':'r'})

# 有时候数据太多或线条太多遮挡住xy轴的标签时,可降低tick(刻度)的透明度
for label in ax.get_xticklabels()+ax.get_yticklabels():
    label.set_fontsize(12)
    label.set_bbox(dict(alpha=0.3,facecolor='white',edgecolor='None',zorder = 2)) #zorder为层级,层级越大越优先被显示

plt.show()

运行效果如下:
在这里插入图片描述

4.绘制散点图

import matplotlib.pyplot as plt
import numpy as np

n = 1024
X = np.random.normal(0,1,n) #N(0,1)的正态分布,随机产生n个点
Y = np.random.normal(0,1,n)
T = np.arctan2(Y,X) #color value

# 画出散点图,其中s为大小size,c为颜色
plt.scatter(X, Y, s=75, c=T,alpha=0.5)

# 对XY轴的范围做限制
plt.xlim((-1.5,1.5))
plt.ylim((-1.5,1.5))

# 去掉XY的刻度
plt.xticks(())
plt.yticks(())

plt.show

运行效果如下:
在这里插入图片描述

5.绘制柱形图

import matplotlib.pyplot as plt
import numpy as np

n = 12
X = np.arange(n)
Y1 = (1-X/float(n))*np.random.uniform(0.5,1,n)
Y2 = (1-X/float(n))*np.random.uniform(0.5,1,n)

plt.bar(X,+Y1,facecolor='#9aa4ff',edgecolor='white')
plt.bar(X,-Y2,facecolor='#ffa59c',edgecolor='white')

# 添加数字
for x,y in zip(X,Y1): # zip的含义为将X,Y1合并成一个元组,分别传值给x,y
    # ha=horizontal alignment
    plt.text(x,y+0.05,'%.2f'%y,ha='center',va='bottom')

for x,y in zip(X,Y2):
    # ha=horizontal alignment
    plt.text(x,-y-0.05,'-%.2f'%y,ha='center',va='top')

plt.xlim(-1,n)
plt.xticks(())
plt.ylim(-1.25,1.25)
plt.yticks(())

plt.show()

运行效果如下:
在这里插入图片描述

6.绘制等高线图

# Contours 等高线图
import matplotlib.pyplot as plt
import numpy as np

# hight function
def f(x,y):
    return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)

# 生成数据
n = 256
x = np.linspace(-3,3,n)
y = np.linspace(-3,3,n)
X,Y = np.meshgrid(x,y) #使用x,y生成网格矩阵

# 画图
# use plt.contourf to filling contours,前三个参数代表X,Y,Z三个值
# X,Y and value for(X,Y) point
plt.contourf(X,Y,f(X,Y),8,alpha=0.7,cmap=plt.cm.hot)

# 画等高线
C=plt.contour(X,Y,f(X,Y),8,colors='black',linewidth=.5)

# 写高度值
plt.clabel(C,inline=True,fontsize=10)

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

plt.show()

运行效果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43943476/article/details/124954433