Matplotlib数据可视化基本操作

      matplotlib是一个Python的2D绘图库,最流行的Python底层绘图库,主要做数据可视化。

      matplotlib使用时需要先导入库,有两种导入方式

from matplotlib import pyplot as plt
import matplotlib.pyplot as plt

      绘制一个简单的方程y=2x+1

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()

      如果有多方函数可以定义多个figure,并指定figure的一些参数,也可以指定所画方程的一些参数

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=1) #序号为1的figure
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--') #指定y1方程的颜色,线的宽度为1.0,线的形状为虚线
plt.figure(num=2,figsize=(8,5)) #序号为2的figure,并指定的这个figure的长为8,高为5
plt.plot(x,y2)
plt.show()

      xlim,ylim可以自定义坐标轴的范围。xlabel,ylabel描述x轴、y轴。ticks用来设置坐标轴单位的小标。

import numpy as np
x = np.linspace(-3,3,50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure()
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.plot(x,y2)
plt.xlim((-1,2)) #x坐标轴的范围
plt.ylim((-2,3)) #y坐标轴的范围
plt.xlabel('I am x') #描述x轴
plt.ylabel('I am y') #描述y轴
new_ticks=np.linspace(-1,2,5)
plt.xticks(new_ticks) #对x轴的小标进行修改
plt.yticks([-2,-1.8,-1,1.22,3],[r'$really\ bad$','$bad$','$normal$','$good$',r'$really\ good$'])
#对y轴的小标进行修改,里面为两个列表,第一个列表为y轴上的数据,第二个列表为y轴上的数据对应的小标
plt.show()

       对坐标轴进行操作

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3,50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure()
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.plot(x,y2)
plt.xlim((-1,2)) #x坐标轴的范围
plt.ylim((-2,3)) #y坐标轴的范围
plt.xlabel('I am x') #描述x轴
plt.ylabel('I am y') #描述y轴
ax = plt.gca()
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)) #设置下边的坐标轴(即x轴)的位置
ax.spines['left'].set_position(('data',0)) #设置左边的坐标轴(即y轴)的位置
plt.show()

      legend图例。不指定参数采用默认打印图例用plt.legend(),如果指定参数,handles说明图例的线条,labels用来指定对应线条的名字,loc用来指定legend的位置

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3,50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure()
plt.xlim((-1,2)) #x坐标轴的范围
plt.ylim((-2,3)) #y坐标轴的范围
plt.xlabel('I am x') #描述x轴
plt.ylabel('I am y') #描述y轴
line1, = plt.plot(x,y2,label='up')
line2, = plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--',label='down')
plt.legend(handles=[line1,line2],labels=['aaa','bbb'],loc='best')
plt.show()

      annotation标注

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') #展示(x0,y0)这个点,大小为50,颜色为blue
plt.plot([x0,x0],[y0,0],'k--',lw=2.5) #(x0,y0)和(x0,0)两个点之间生成一条颜色为黑色的虚线,线宽2.5
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')) #arrowprops表示箭头的类型

plt.text(-3,3,r'$This\ is\ some\ text.\mu\ \sigma_i\ \alpha_t$',fontdict={'size':16,'color':'red'})
plt.show()

       实例:用matplotlib绘制sin(x)和cos(x)的函数图像,其中要包含图例,在x=1处进行标注。

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-np.pi,np.pi,256,endpoint=True)
c = np.cos(x)
s = np.sin(x)
plt.figure()
plt.plot(x,c,color='blue',linewidth=1.0,linestyle='--',label='cos',alpha=0.5)
plt.plot(x,s,color='red',linewidth=1.0,label='sin',alpha=0.5)
plt.title('cos & sin')
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))
plt.xticks([-np.pi,-np.pi/2,0,np.pi/2,np.pi],
           [r'$-\ pi$',r'$-\ pi/2$',r'$0$',r'$+\ pi/2$',r'$+\ pi$'])
plt.yticks(np.linspace(-1,1,5,endpoint=True))
for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(16)
    label.set_bbox(dict(facecolor='white',edgecolor='none',alpha=0.2)) #facecolor为背景颜色,edgecolor为边缘颜色
plt.legend(loc='best')
plt.grid() #设置网格线
plt.fill_between(x,np.abs(x)<0.5,c,c>0.5,color='green',alpha=0.25)
t=1
plt.plot([t,t],[0,np.cos(t)],'y',linewidth=3,linestyle='--')
plt.annotate('cos(1)',xy=(t,np.cos(1)),xycoords='data',xytext=(+10,+30),textcoords='offset points',
            arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))
plt.show()

       scatter散点图

import matplotlib.pyplot as plt
import numpy as np
n = 128
X = np.random.normal(0,1,n)
Y = np.random.normal(0,1,n)
T = np.arctan2(Y,X) #设置颜色
plt.scatter(X,Y,s=75,c=T,alpha=0.5) #其实s是size的缩写,c是color的缩写,alpha表示透明度
plt.xlim(-1.5,1.5)
plt.ylim(-1.5,1.5)
plt.xticks(()) #将x轴上的小标设置为空
plt.yticks(()) #将y轴上的小标设备为空
plt.title('scatter')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

      bar柱状图

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.0,n)
Y2 = (1-X/float(n))*np.random.uniform(0.5,1.0,n)
plt.bar(X,+Y1,facecolor='#9999ff',edgecolor='white') #+Y1表示向上
plt.bar(X,-Y2,facecolor='#ff9999',edgecolor='white') #-Y2表示向下
for x,y in zip(X,Y1):
    plt.text(x,y+0.05,'%.2f' %y,ha='center',va='bottom') #ha表示横向对齐,va表示纵向对齐
for x,y in zip(X,Y2):
    plt.text(x,-y-0.05,'%.2f' %y,ha='center',va='top')
plt.xlim(-0.5,n)
plt.xticks(())
plt.ylim(-1.25,1.25)
plt.yticks(())
plt.show()

       更详细的内容可以参照 https://mp.weixin.qq.com/s/e_JICIHfp5ZTdX9PTx6FQw

posted @ 2020-07-25 22:53  Chenjin2018  阅读(337)  评论(0编辑  收藏  举报