python之matloplib可视化

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10, 20, 50, True)
y = 2 * x + 5

# 一、画散点图
plt.scatter(x,y,s=40,c='Orange',edgecolors='k',marker='s',alpha=0.5)
#s:大小;c:内部颜色;edgecolors:边框颜色;marker:点的形状;alpha:透明度
plt.show()

# 二、画折线图与线段
plt.figure()
plt.plot(x, y, label='line1')
plt.plot(x, y + 4, c='r', lw=2, ls=':', label='line2')
# c:颜色;lw:线宽;ls:线段类型,有“:”“--”“-”等;lebel:画图图例;
plt.plot([-10, 0], [-10, 0], ls='--', label='line3')  # 两点连线
plt.legend()
plt.show()

# 三、画柱状图
# 1、单一柱状图
plt.figure()
bar_x = np.arange(5)
bar_y = np.arange(5)
rects = plt.bar(bar_x, height=bar_y, width=0.8,orientation='vertical')
# 给每个柱添加数据标识
for rect in rects:
    plt.text(rect.get_x() + rect.get_width() / 2, rect.get_height(), rect.get_height(), ha='center', va='bottom')
plt.show()

# 2、横向柱状图
# method 1 :
plt.figure()
plt.barh(bar_y,bar_x,height=0.8,left=0) #left柱状图左边的起始位置,0表示从x=0开始
plt.show()

# method 2 :
plt.figure()
plt.bar(x=0,bottom=bar_x, width=bar_y, height=0.5,orientation='horizontal') #bottom:柱状图底部起始位置为y=bar_x,orientation设置柱状图方向
plt.show()

# 3、并列图
plt.figure()
plt.bar(bar_x, height=bar_y, width=0.2,orientation='vertical',color='b') #第一个蓝色柱状图
plt.bar(bar_x+0.2, height=bar_y, width=0.2,orientation='vertical',color='r') #第二个红色柱状图,用bar_x+0.2设置宽度及柱状图偏移的方式将其与第一个图分开
plt.show()

# 4、堆叠图
plt.figure()
plt.bar(bar_x, height=bar_y, width=0.2,orientation='vertical',color='b') #第一个蓝色柱状图
plt.bar(bar_x, height=bar_y, width=0.2,bottom=bar_x,orientation='vertical',color='r') #第二个红色柱状图,用bottom=bar_x设置底部起点的方式将其与第一个图分开
plt.show()

# 四、直方图(频数图)
plt.hist(np.random.normal(0,2,1000),bins=100,density=True) #bins:分箱个数,若传入一个list,如[0,1,2,3]表示根据0、1、2、3位断点分箱
plt.show()

# 五、饼状图
plt.figure()
plt.axes(aspect=1) #设置xy比例不然饼状图会被压扁
plt.pie([1,2,3,4,5],explode=[0.5,0,0,0,0],labels=list('abcde'),autopct='%.2f%%',shadow=True)
#explode:一个list表示每一部分离中心的距离,autopct='%.2f%%'显示百分比,shadow=True生成阴影更好看
plt.show()

# 六、箱形图
plt.figure()
plt.boxplot(np.random.normal(0,1,1000),sym='o',whis=1.5)  #sym异常点显示类型,whis设置异常点范围,[Q1-whis*IQR,Q3+whis*IQR]以外的为异常值
plt.figure()
plt.boxplot(np.random.normal(0,1,(1000,4)),sym='o',whis=1.5)  #传入多维数组可以画多个箱形图
plt.show()

# 七、画坐标轴为日期的图
d=['2019-01','2019-02','2019-03','2019-04','2019-05','2019-06','2019-07','2019-08','2019-09','2019-10','2019-11','2019-12']
plt.plot_date(d,y[0:12])
plt.show()

# 八、设置画板figure
plt.figure(num='fig1',figsize=(8,6),facecolor='w',edgecolor='k') #num:画板名,figsize=(8,6)画板长宽,facecolor:底色,edgecolor边框颜色
plt.title('fig1') 添加图标题
plt.plot([0,1],[0,1])
plt.figure(num='fig2') #定第二个画板,可以显示两个图,不然会在原来的fig2上覆盖
plt.title('fig2')
plt.plot([0,1],[1,0])
# 获取当前图标与子图可以使用plt.gcf()和plt.gca()获得,分别表示Get Current Figure和Get Current Axes,在pyplot模块中,
# 许多函数都是对当前的Figure或Axes对象进行处理,比如说:plt.plot()实际上会通过plt.gca()获得当前的Axes对象ax,然后再调用ax.plot()方法实现真正的绘图。
plt.show()

# 九、坐标轴设置
plt.figure()
plt.title('fig1')
plt.xlim((0, 10))  # 修改x坐标轴范围
plt.plot([0, 20], [20, 0])
plt.xlabel(r'$x\ label$')  # 添加x轴标签,matplotlib中使用$$表示latex数学字符,空格要用\转义

plt.figure()
plt.title('fig2')
plt.xticks(np.linspace(0, 10, 3, True))  # 修改x标签的数值间隔
plt.plot([0, 10], [10, 0])

plt.figure()
plt.title('fig3')
plt.xticks(ticks=np.linspace(0, 10, 3, True), labels=['2015', '2016', '2017'])  # 用lebals替换x轴ticks的对应数值
plt.plot([0, 10], [10, 0])

plt.figure()
plt.title('fig4')
ax = plt.gca()
ax.spines['right'].set_color('None')  # 去除右坐标轴颜色,相当于隐藏,spines表示子图方框线集合,left、bottom、right、top表示四个方框线
ax.spines['top'].set_color('None')  # 去除上坐标轴颜色,相当于隐藏
ax.xaxis.set_ticks_position('bottom')  # 设置x轴位置为底部,可设置为上侧top
ax.yaxis.set_ticks_position('left')  # 设置y轴位置为左侧,可设置为右侧right
ax.spines['bottom'].set_position(('data', 5))  # 底部的坐标轴放在y=5的位置,data表示采用数据轴,(data,5)替换成(axes,0.5)则表示放在y轴%50的位置
ax.spines['left'].set_position(('data', 5))  # 左侧的坐标轴放在x=5的位置
plt.plot([0, 10], [10, 0])
plt.show()

#十、绘制图例
plt.figure()
l1,=plt.plot(x,y,c='g',label='y=2*x+5') #返回值不止一个所以l1后面加一个逗号,参数label为画图图例
l2,=plt.plot(x,-y,c='y',label='y=2*x+5')
plt.legend(loc='upper center')    #显示所有画图图例,参数loc为图例位置,默认为loc='best',自动选取位置
plt.figure()
l1,=plt.plot(x,y,c='g',label='y=2*x+5')
l2,=plt.plot(x,-y,c='y',label='y=2*x+5')
plt.legend(handles=[l1,l2],labels=['f=2*x+5','f=2*x+5'],loc='')   #对特定的图添加指定的图例说明,参数handles为line对象
plt.show()

# 十一、添加注解
# 1、给点添加注解
plt.figure()
plt.scatter(1, 1, c='r', marker='o')  # 画(1,1)点
plt.annotate(s=r'$this\ is\ an\ annotate$', xy=(1, 1), xycoords='data', xytext=(30, -30), textcoords='offset points',
             fontsize=16, arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))
#s:注释;xy:要注释的点的坐标;xycoords='data':点的坐标为数据坐标;xytext=(30, -30):注释的坐标为(30,-30);
# textcoords='offset points':注释的坐标轴为以点为原点进行偏移;fontsize:字体大小;
# arrowprops:设定箭头,arrowstyle箭头类型为'->',connectionstyle连接类型为'arc3,rad=.2'

# 2、在指定位置添加注解
plt.figure()
plt.scatter(1, 1, c='r', marker='o')  # 画(1,1)点
plt.text(1,1,r'$this\ is\ a\ text$',fontdict=dict(size=16,color='r'), ha='center', va='bottom')   #在点(1,1)处添加文档,ha、va表示左右上下对齐方式
plt.show()

# 十二、绘制多个图在一个面板中
# method 1 :在大小相同的格子中画图
plt.subplot(221)  #画板分为2*2,在位置1画图
plt.plot(x, y)
plt.scatter(5,0,marker='o',edgecolors='b',facecolors='r')
plt.subplot(222)
plt.plot(x,-y)
plt.show()

# method 2 :在自定义大小的格子中画图
ax1=plt.subplot2grid((3,3),(0,0),colspan=3,rowspan=1) #画板分成3*3网格,ax1位置在(0,0),跨度为3列1行
ax1.plot([0,1],[0,1])
ax1.set_title('ax1')
ax2=plt.subplot2grid((3,3),(1,1),colspan=3,rowspan=3) #画板分成3*3网格,ax1位置在(1,1),跨度为3列3行
ax2.plot(x,-y)
ax2.set_title('ax2')
ax3=plt.subplot2grid((3,3),(1,0),colspan=1,rowspan=1) #画板分成3*3网格,ax1位置在(1,0),跨度为1列1行
ax3.plot(x,-y)
ax3.set_title('ax3')
plt.show()

# 十三、图中图,利用在同一画板定义多个坐标轴实现
fig=plt.figure()
left,bottom,width,height=0.1,0.1,0.8,0.8   #定义坐标轴的左、下坐标轴位置,宽、高的跨度,用百分比的形式
ax1=fig.add_axes([left,bottom,width,height])  #加入第一个坐标轴
ax1.plot(x,y,c='y')
ax1.set_titile('ax1')
ax2=fig.add_axes([left,bottom,width,height]) #加入第二个坐标轴
ax2.plot(x,-y,c='g')
ax2.set_titile('ax2')
plt.show()

# 十四、主次坐标轴
fig,ax1=plt.subplots()
ax2=ax1.twinx() #镜像ax1得到次坐标轴
ax1.plot([0,1],[0,1],c='r')
ax2.plot([0,1],[1,0],c='y')
plt.show()

 

上一篇:Python可视化——Matplotlib & Seaborn


下一篇:可视化篇(一)———使用matplotlib绘制常用3D图形及案例