Matplotlib之绘制精美的图表PPT(82张)
- 格式:ppt
- 大小:1.97 MB
- 文档页数:82
Python数据可视化进阶——使用Matplotlib和Bokeh进行高级图表制作在数据处理和分析的过程中,数据可视化是一项非常关键且广泛使用的工具。
通过数据可视化,我们可以通过图表直观地了解数据的特征、趋势和模式等信息。
在Python中,有许多数据可视化工具可供选择,如Matplotlib、Seaborn、Plotly、Bokeh等等。
本篇文章主要介绍如何使用Matplotlib和Bokeh进行高级图表制作。
一、Matplotlib1. 简介Matplotlib是Python中最常用的数据可视化工具之一,可以绘制各种类型的图表,如折线图、柱状图、散点图、饼图、热力图等等。
Matplotlib 的核心处理模块pyplot提供了类似于MATLAB的接口,非常方便易用。
2. 折线图折线图是一种用线段将数据点连接起来的图表形式,通常用于表示时间序列数据的趋势。
下面是一个简单的折线图的代码示例:```pythonimport matplotlib.pyplot as plt# 准备数据x = [1, 2, 3, 4, 5]y = [1, 3, 2, 4, 5]# 绘制折线图plt.plot(x, y, marker='o')# 设置图表标题、坐标轴标签plt.title('Line Chart')plt.xlabel('X-axis')plt.ylabel('Y-axis')# 显示图表plt.show()```3. 散点图散点图是一种用坐标系表示两个变量之间关系的图表形式,通常用于探究变量间的关联性。
下面是一个简单的散点图的代码示例:```pythonimport matplotlib.pyplot as plt# 准备数据x = [1, 2, 3, 4, 5]y = [1, 3, 2, 4, 5]# 绘制散点图plt.scatter(x, y, color='red')# 设置图表标题、坐标轴标签plt.title('Scatter Plot')plt.xlabel('X-axis')plt.ylabel('Y-axis')# 显示图表plt.show()```4. 柱状图柱状图是一种用矩形表示数据大小的图表形式。
Python数据可视化教程之Matplotlib实现各种图表实例前⾔数据分析就是将数据以各种图表的形式展现给领导,供领导做决策⽤,因此熟练掌握饼图、柱状图、线图等图表制作是⼀个数据分析师必备的技能。
Python有两个⽐较出⾊的图表制作框架,分别是Matplotlib和Pyechart。
本⽂主要讲述使⽤Matplotlib制作各种数据图表。
Matplotlib是最流⾏的⽤于绘制2D数据图表的Python库,能够在各种平台上使⽤,可以绘制散点图、柱状图、饼图等。
1、柱状图是⼀种以长⽅形或长⽅体的⾼度为变量的表达图形的统计报告图,由⼀系列⾼度不等的纵向条纹表⽰数据分布的情况,⽤来⽐较两个或以上的价值(不同时间或者不同条件),只有⼀个变量,通常利⽤于较⼩的数据集分析。
柱状图可以⽤来⽐较数据之间的多少,可以⽤来观察某⼀事件的变化趋势,柱状图亦可横向排列,或⽤多维⽅式表达。
实现代码:# 导⼊绘图模块import matplotlib.pyplot as plt# 构建数据sales = [7125,12753,13143,8635]# 中⽂乱码的处理,rcParams也可以⽤于设置图的分辨率,⼤⼩等信息plt.rcParams['font.sans-serif'] =['SimHei']plt.rcParams['axes.unicode_minus'] = False# 绘图,第⼀个参数是x轴的数据,第⼆个参数是y轴的数据,第三个参数是柱⼦的⼤⼩,默认值是1(值在0到1之间),color是柱⼦的颜⾊,alpha是柱⼦的透明度plt.bar(range(4), sales, 0.4,color='r', alpha = 0.8)# 添加轴标签plt.ylabel('销量')# 添加标题plt.title('⽔果2018年度销量')# 添加刻度标签plt.xticks(range(4),['苹果','⾹蕉','梨','猕猴桃'])# 设置Y轴的刻度范围plt.ylim([5000,15000])# 为每个条形图添加数值标签for x,y in enumerate(sales):plt.text(x,y+100,'%s' %y,ha='center')# 显⽰图形plt.show()效果图:只需绘制柱状图的函数bar()改成barh()就可以将柱状图长⽅形或长⽅体从垂直⽅向变为⽔平⽅向。
图表类别:线形图、柱状图、密度图,以横纵坐标两个维度为主同时可延展出多种其他图表样式plt.plot(kind='line', ax=None, figsize=None, use_index=True, title=None, grid=None, legend=False, style=None, logx=False, logy=False, loglog=False, xticks=None, yticks=None, xlim=None, ylim=None, rot=None,fontsize=None, colormap=None, table=False, yerr=None, xerr=None, label=None, secondary_y=False, **kwds)In [1]:import numpy as npimport pandas as pdimport matplotlib.pyplot as plt% matplotlib inline# 导入相关模块import warningswarnings.filterwarnings('ignore')# 不发出警告In [2]:Out[2]:<matplotlib.legend.Legend at 0x2a6186ec940># Series 直接生成图表ts = pd.Series(np.random.randn(1000), index =pd.date_range('1/1/2000', periods =1000))ts = ts.cumsum()ts.plot(kind ='line',label = 'hehe',style = '--g.',color = 'red',alpha = 0.4,use_index = True ,rot = 45,grid = True ,ylim = [-50,50],yticks = list (range (-50,50,10)),figsize = (8,4),title = 'test',legend = True )#plt.grid(True, linestyle = "--",color = "gray", linewidth = "0.5",axis = 'x') # 网格plt.legend()# Series.plot():series 的index 为横坐标,value 为纵坐标# kind → line,bar,barh...(折线图,柱状图,柱状图-横...)# label → 图例标签,Dataframe 格式以列名为label # style → 风格字符串,这里包括了linestyle (-),marker (.),color (g )# color → 颜色,有color 指定时候,以color 颜色为准# alpha → 透明度,0-1# use_index → 将索引用为刻度标签,默认为True # rot → 旋转刻度标签,0-360# grid → 显示网格,一般直接用plt.grid # xlim,ylim → x,y 轴界限# xticks,yticks → x,y 轴刻度值# figsize → 图像大小# title → 图名# legend → 是否显示图例,一般直接用plt.legend()# 也可以 → plt.plot()In [3]:Out[3]:<matplotlib.axes._subplots.AxesSubplot at 0x2a61887e7f0># Dataframe 直接生成图表df = pd.DataFrame(np.random.randn(1000, 4), index =ts.index, columns =list ('ABCD'))df = df.cumsum()df.plot(kind ='line',style = '--.',alpha = 0.4,use_index = True ,rot = 45,grid = True ,figsize = (8,4),title = 'test',legend = True ,subplots = False ,colormap = 'Greens')# subplots → 是否将各个列绘制到不同图表,默认False # 也可以 → plt.plot(df)Out[4]:<matplotlib.axes._subplots.AxesSubplot at 0x2a618f86780># 柱状图与堆叠图fig,axes = plt.subplots(4,1,figsize = (10,10))s = pd.Series(np.random.randint(0,10,16),index = list ('abcdefghijklmnop'))df = pd.DataFrame(np.random.rand(10,3), columns =['a','b','c'])s.plot(kind ='bar',color = 'k',grid = True ,alpha = 0.5,ax = axes[0]) # ax 参数 → 选择第几个子图# 单系列柱状图方法一:plt.plot(kind='bar/barh')df.plot(kind ='bar',ax = axes[1],grid = True ,colormap ='Reds_r')# 多系列柱状图df.plot(kind ='bar',ax = axes[2],grid = True ,colormap ='Blues_r',stacked =True )# 多系列堆叠图# stacked → 堆叠df.plot.barh(ax = axes[3],grid = True ,stacked =True ,colormap = 'BuGn_r')# 新版本plt.plot.<kind># 柱状图 plt.bar()plt.figure(figsize=(10,4))x = np.arange(10)y1 = np.random.rand(10)y2 =-np.random.rand(10)plt.bar(x,y1,width =1,facecolor ='yellowgreen',edgecolor ='white',yerr = y1*0.1)plt.bar(x,y2,width =1,facecolor ='lightskyblue',edgecolor ='white',yerr = y2*0.1)# x,y参数:x,y值# width:宽度比例# facecolor柱状图里填充的颜色、edgecolor是边框的颜色# left-每个柱x轴左边界,bottom-每个柱y轴下边界→ bottom扩展即可化为甘特图 Gantt Chart# align:决定整个bar图分布,默认left表示默认从左边界开始绘制,center会将图绘制在中间位置# xerr/yerr :x/y方向error barfor i,j in zip(x,y1):plt.text(i+0.3,j-0.15,'%.2f'% j, color ='white')for i,j in zip(x,y2):plt.text(i+0.3,j+0.05,'%.2f'%-j, color ='white')# 给图添加text# zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的Out[6]:<matplotlib.axes._subplots.AxesSubplot at 0x2a61a397860>fig,axes = plt.subplots(2,1,figsize = (8,6))df1 = pd.DataFrame(np.random.rand(10, 4), columns =['a', 'b', 'c', 'd'])df2 = pd.DataFrame(np.random.randn(10, 4), columns =['a', 'b', 'c', 'd'])df1.plot.area(colormap = 'Greens_r',alpha = 0.5,ax = axes[0])df2.plot.area(stacked =False ,colormap = 'Set2',alpha = 0.5,ax = axes[1])# 使用Series.plot.area()和DataFrame.plot.area()创建面积图# stacked :是否堆叠,默认情况下,区域图被堆叠# 为了产生堆积面积图,每列必须是正值或全部负值!# 当数据有NaN 时候,自动填充0,所以图标签需要清洗掉缺失值fig,axes = plt.subplots(2,1,figsize = (8,6))x = np.linspace(0, 1, 500)y1 = np.sin(4* np.pi * x) * np.exp(-5* x)y2 =-np.sin(4* np.pi * x) * np.exp(-5* x)axes[0].fill(x, y1, 'r',alpha=0.5,label='y1')axes[0].fill(x, y2, 'g',alpha=0.5,label='y2')# 对函数与坐标轴之间的区域进行填充,使用fill函数# 也可写成:plt.fill(x, y1, 'r',x, y2, 'g',alpha=0.5)x = np.linspace(0, 5* np.pi, 1000)y1 = np.sin(x)y2 = np.sin(2* x)axes[1].fill_between(x, y1, y2, color ='b',alpha=0.5,label='area') # 填充两个函数之间的区域,使用fill_between函数for i in range(2):axes[i].legend()axes[i].grid()# 添加图例、格网a 2.642335b 0.684839c 1.149305d 2.807174Name: series, dtype: float64# 饼图 plt.pie()# plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, la # radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, hold=s = pd.Series(3 * np.random.rand(4), index =['a', 'b', 'c', 'd'], name ='series')plt.axis('equal') # 保证长宽相等plt.pie(s,explode = [0.1,0,0,0],labels = s.index,colors =['r', 'g', 'b', 'c'],autopct ='%.2f%%',pctdistance =0.6,labeldistance = 1.2,shadow = True ,startangle =0,radius =1.5,frame =False )print (s)# 第一个参数:数据# explode :指定每部分的偏移量# labels :标签# colors :颜色# autopct :饼图上的数据标签显示方式# pctdistance :每个饼切片的中心和通过autopct 生成的文本开始之间的比例# labeldistance :被画饼标记的直径,默认值:1.1# shadow :阴影# startangle :开始角度# radius :半径# frame :图框# counterclock :指定指针方向,顺时针或者逆时针In [9]:Out[9]:<matplotlib.axes._subplots.AxesSubplot at 0x2a61aac7198># 直方图+密度图s = pd.Series(np.random.randn(1000))s.hist(bins = 20,histtype = 'bar',align = 'mid',orientation = 'vertical',alpha =0.5,normed =True )# bin :箱子的宽度# normed 标准化# histtype 风格,bar ,barstacked ,step ,stepfilled # orientation 水平还是垂直{‘horizontal’, ‘vertical’}# align : {‘left’, ‘mid’, ‘right’}, optional(对齐方式)s.plot(kind ='kde',style ='k--')# 密度图In [10]:Out[10]:array([[<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61B3E3EF0>,<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61B555C18>],[<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61B59ED68>,<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61B5DF6A0>]],dtype=object)<matplotlib.figure.Figure at 0x2a618ccae10># 堆叠直方图plt.figure(num =1)df = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000),'c': np.random.randn(1000) - 1, 'd': np.random.randn(1000)-2},columns =['a', 'b', 'c','d'])df.plot.hist(stacked =True ,bins =20,colormap ='Greens_r',alpha =0.5,grid =True )# 使用DataFrame.plot.hist()和Series.plot.hist()方法绘制# stacked :是否堆叠df.hist(bins =50)# 生成多个直方图# plt.scatter()散点图# plt.scatter(x, y, s=20, c=None, marker='o', cmap=None, norm=None, vmin=None, vmax=None, # alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)plt.figure(figsize=(8,6))x = np.random.randn(1000)y = np.random.randn(1000)plt.scatter(x,y,marker='.',s = np.random.randn(1000)*100,cmap ='Reds',c = y,alpha =0.8,)plt.grid()# s:散点的大小# c:散点的颜色# vmin,vmax:亮度设置,标量# cmap:colormapOut[12]:array([[<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61B496E10>,<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61C9FD550>,<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61CA45F28>,<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61CA80BE0>],[<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61CACAE10>,<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61CB06BA8>,<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61CB4ECF8>,<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61CB5EFD0>],[<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61CD5E4E0>,<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61CDA9438>,<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61CDE7240>,<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61CE32C18>],[<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61CE6E2E8>,<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61CEBBA58>,<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61CEF9128>,<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61CF42278>]],dtype=object)# pd.scatter_matrix()散点矩阵# pd.scatter_matrix(frame, alpha=0.5, figsize=None, ax=None, # grid=False, diagonal='hist', marker='.', density_kwds=None, hist_kwds=None, range_padding=0.05, **df = pd.DataFrame(np.random.randn(100,4),columns = ['a','b','c','d'])pd.scatter_matrix(df,figsize =(10,6),marker = 'o',diagonal ='kde',alpha = 0.5,range_padding =0.1)# diagonal :({‘hist’, ‘kde’}),必须且只能在{‘hist’, ‘kde’}中选择1个 → 每个指标的频率图# range_padding :(float, 可选),图像在x 轴、y 轴原点附近的留白(padding),该值越大,留白距离越大,图像远Out[13]:<matplotlib.axes._subplots.AxesSubplot at 0x2a61b452978>fig,axes = plt.subplots(2,1,figsize =(10,6))df = pd.DataFrame(np.random.rand(10, 5), columns =['A', 'B', 'C', 'D', 'E'])color = dict (boxes ='DarkGreen', whiskers ='DarkOrange', medians ='DarkBlue', caps ='Gray')# 箱型图着色# boxes → 箱线# whiskers → 分位数与error bar 横线之间竖线的颜色# medians → 中位数线颜色# caps → error bar 横线颜色df.plot.box(ylim =[0,1.2],grid = True ,color = color,ax = axes[0])# color :样式填充df.plot.box(vert =False ,positions =[1, 4, 5, 6, 8],ax = axes[1],grid = True ,color = color)# vert :是否垂直,默认True # position :箱型图占位{'boxes': [<matplotlib.patches.PathPatch object at 0x000002A61CBCBA20>, <matplotlib.patches.PathPatch object at 0x000002A61CBDCA90>, <matplotlib.patches.PathPatch object at 0x000002A61CBF1940>, <matplotlib.patches.PathPatch object at 0x000002A61CC098D0>, <matplotlib.patches.PathPatch object at 0x000002A61CC1F860>], 'means': [<matplotlib.lines.Line2D object at 0x000002A61CBD44A8>, <matplotlib.lines.Line2D object at 0x000002A61CBEC390>, <matplotlib.lines.Line2D object at 0x000002A61CC03320>, <matplotlib.lines.Line2D object at 0x000002A61CC192B0>, <matplotlib.lines.Line2D object at 0x000002A61CB92438>], 'medians': [<matplotlib.lines.Line2D object at 0x000002A61CBC3EF0>, <matplotlib.lines.Line2D object at 0x000002A61CBE6B38>, <matplotlib.lines.Line2Dobject at 0x000002A61CBFEAC8>, <matplotlib.lines.Line2D object at 0x000002A61CC14A58>, <matplotlib.lines.Line2D object at 0x000002A61CB96470>], 'caps': [<matplotlib.lines.Line2D object at 0x000002A61CBCEBE0>, <matplotlib.lines.Line2D object at 0x000002A61CBCECF8>, <matplotlib.lines.Line2D object at 0x000002A61CBE2AC8>, <matplotlib.lines.Line2D object at 0x000002A61CBE69B0>, <matplotlib.lines.Line2D object at 0x000002A61CBF7A58>, <matplotlib.lines.Line2D object at 0x000002A61CBFE940>, <matplotlib.lines.Line2D object at 0x000002A61CC0DF98>, <matplotlib.lines.Line2D object at 0x000002# pltboxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artis # usermedians=None, conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None,# labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None, # zorder=None, hold=None, data=None)df = pd.DataFrame(np.random.rand(10, 5), columns =['A', 'B', 'C', 'D', 'E'])plt.figure(figsize =(10,4))# 创建图表、数据f = df.boxplot(sym = 'o', # 异常点形状,参考markervert = True , # 是否垂直whis = 1.5, # IQR ,默认1.5,也可以设置区间比如[5,95],代表强制上下边缘为数据95%和5%位 patch_artist = True , # 上下四分位框内是否填充,True 为填充meanline = False ,showmeans =True , # 是否有均值线及其形状showbox = True , # 是否显示箱线showcaps = True , # 是否显示边缘线showfliers = True , # 是否显示异常值notch = False , # 中间箱体是否缺口return_type ='dict' # 返回类型为字典)plt.title('boxplot')print (f)for box in f['boxes']:box.set( color ='b', linewidth =1) # 箱体边框颜色box.set( facecolor = 'b' ,alpha =0.5) # 箱体内部填充颜色for whisker in f['whiskers']:whisker.set(color ='k', linewidth =0.5,linestyle ='-')for cap in f['caps']:cap.set(color ='gray', linewidth =2)for median in f['medians']:median.set(color ='DarkBlue', linewidth =2)for flier in f['fliers']:flier.set(marker ='o', color ='y', alpha =0.5)# boxes, 箱线# medians, 中位值的横线,# whiskers, 从box 到error bar 之间的竖线.# fliers, 异常值# caps, error bar 横线# means, 均值的横线,A61CC148D0>, <matplotlib.lines.Line2D object at 0x000002A61CB9DF28>, <matplotlib.lin es.Line2D object at 0x000002A61CB9D208>], 'fliers': [<matplotlib.lines.Line2D object at 0x000002A61CBD4B70>, <matplotlib.lines.Line2D object at 0x000002A61CBECB00>, <mat plotlib.lines.Line2D object at 0x000002A61CC03A90>, <matplotlib.lines.Line2D object at 0x000002A61CC19A20>, <matplotlib.lines.Line2D object at 0x000002A61CC24EB8>], 'wh iskers': [<matplotlib.lines.Line2D object at 0x000002A61CBCBE80>, <matplotlib.lines. Line2D object at 0x000002A61CBCBFD0>, <matplotlib.lines.Line2D object at 0x000002A61 CBDCFD0>, <matplotlib.lines.Line2D object at 0x000002A61CBE2940>, <matplotlib.lines. Line2D object at 0x000002A61CBF1F98>, <matplotlib.lines.Line2D object at 0x000002A61 CBF78D0>, <matplotlib.lines.Line2D object at 0x000002A61CC09F28>, <matplotlib.lines. Line2D object at 0x000002A61CC0D860>, <matplotlib.lines.Line2D object at 0x000002A61 CC1FEB8>, <matplotlib.lines.Line2D object at 0x000002A61CC247F0>]}In [15]:Col1 Col2 X Y0 0.479199 0.121721 A A1 0.710598 0.417871 A B2 0.935067 0.622724 A A3 0.528266 0.730086 A B4 0.898821 0.328273 A AOut[15]:array([<matplotlib.axes._subplots.AxesSubplot object at 0x000002A61D0A1940>, <matplotlib.axes._subplots.AxesSubplot object at 0x000002A61D0E9FD0>], dtype=object)# 箱型图# plt.boxplot()绘制# 分组汇总df = pd.DataFrame(np.random.rand(10,2), columns =['Col1', 'Col2'] )df['X'] = pd.Series(['A','A','A','A','A','B','B','B','B','B'])df['Y'] = pd.Series(['A','B','A','B','A','B','A','B','A','B'])print (df.head())df.boxplot(by = 'X')df.boxplot(column =['Col1','Col2'], by =['X','Y'])# columns :按照数据的列分子图# by :按照列分组做箱型图。
pythonmatplotlib绘图⼤全(散点图、柱状图、饼图、极坐标图、热量图、三维图以及热图)//2019.7.14晚matplotlib七种常见图像输出编程⼤全七种图形汇总输出如下:import numpy as np #导⼊数据结构nmupy模块import matplotlib.pyplot as plt #导⼊matplotlib图像输出模块plt.rcParams["font.sans-serif"]=["SimHei"] #输出图像的标题可以为中⽂正常输出plt.rcParams["axes.unicode_minus"]=False #可以正常输出图线⾥的负号(必会⽤到的导⼊模块)#1-1散点图输出fig=plt.figure()fig.add_subplot(3,3,1)n=128X=np.random.normal(0,1,n) #随机数X的⽣成(⽣成正态分布,平均数为0,⽅差为1,个数为128)Y=np.random.normal(0,1,n) #随机数Y的⽣成(⽣成正态分布,平均数为0,⽅差为1,个数为128)T=np.arctan2(Y,X)#plt.axes([0.025,0.025,0.95,0.95]) #指定显⽰范围plt.scatter(X,Y,s=75,c=T,alpha=.5) #画散点图的函数scatter(其中XY表⽰数值的⼤⼩,s表⽰散点的尺⼨⼤⼩,c表⽰颜⾊,alpha表⽰透明度)plt.xlim(-1.5,1.5),plt.xticks([]) #x和y坐标轴的范围plt.ylim(-1.5,1.5),plt.yticks([]) #x和y坐标轴的范围plt.axis() #显⽰所有图像范围plt.title("scatter")plt.xlabel("x")plt.ylabel("y")#1-2bar 柱状图fig.add_subplot(3,3,2)n=10X=np.arange(n) #定义从0-9的数列Y1=(1-X/float(n))*np.random.uniform(0.5,1.0,n) #定义变量X的计算⽅式Y2=(1-X/float(n))*np.random.uniform(0.5,1.0,n) #定义变量Y的计算⽅式plt.bar(X,Y1,facecolor="#9999ff",edgecolor="white") #编辑输出柱状图的格式(其中facecolor表⽰输出柱状图的颜⾊,edgecolor表⽰边框的颜⾊)plt.bar(X,-Y2,facecolor="#ff9999",edgecolor="white") #编辑输出柱状图的格式for x,y in zip(X,Y1): #编辑输出柱状图的位置格式(其中0.4表⽰每个柱状图之间的距离,'%.2f'% y表⽰输出⼩数点的位数,ha表⽰数值标注横向对齐,va表⽰柱状图纵向对齐位置)plt.text(x,y+0.05,'%.2f'% y,ha='center',va="bottom")for x, y in zip(X,Y2):plt.text(x,-y-0.05,'%.2f'% y,ha='center',va="top")#Pie1-3(饼图)fig.add_subplot(3,3,3)n=20z=np.ones(n)z[-1]=2plt.pie(z,explode=z*.05,colors=["%f"%(i/float(n)) for i in range(n)],labels=["%.2f"%(i/float(n)) for i in range(n)])#其中z为原来输⼊的数组,explode表⽰整个扇形距离圆⼼的距离⼤⼩(如果不写默认为0),colors表⽰颜⾊变化,labels表⽰各个扇形的数值⼤⼩(其中2表⽰⼩数位数⼤⼩plt.gca().set_aspect("equal") #圆形plt.xticks([])plt.yticks([])plt.show()theta=np.arange(0.0,2*np.pi,2*np.pi/n) #定义⾓度radii=10*np.random.rand(n) #定义半径plt.plot(theta,radii) #输出折线图#plt.polar(theta,radii)两种⽅式都可以 #输出极坐标图data=np.random.rand(3,3)cmap=cm.Blues #选择颜⾊系为蓝⾊体系map=plt.imshow(data,interpolation="nearest",cmap=cmap,aspect="auto",vmin=0,vmax=1) #设置图像输出时的格式y=np.random.randint(1,10,10)z=x*2+2*y #函数关系式plt.plot(x,y,z,"r") #输出3D图像#1-7 hotmap热流图fig.add_subplot(313)def f(x,y):return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)n=256x=np.linspace(-3,3,n)y=np.linspace(-3,3,n)X,Y=np.meshgrid(x,y) #将xy转换为矩阵#将向量x和y定义的区域转换成矩阵X和Y,其中矩阵X的⾏向量是向量x的简单复制,⽽矩阵Y的列向量是向量y的简单复制#假设x是长度为m的向量,y是长度为n的向量,则最终⽣成的矩阵X和Y的维度都是 nm (注意不是mn)plt.contourf(X,Y,f(X,Y),8,cmap=plt.cm.hot) #输出热流图plt.show()。
python强⼤的绘图模块matplotlib⽰例讲解Matplotlib 是 Python 的绘图库。
作为程序员,经常需要进⾏绘图,在我⾃⼰的⼯作中,如果需要绘图,⼀般都是将数据导⼊到excel中,然后通过excel⽣成图表,这样操作起来还是⽐较繁琐的,所以最近学习了⼀下Matplotlib模块,将该模块的常⽤的绘图⼿段和⼤家分享⼀下,提⾼⼤家在⼯作中的效率;在⽰例中,我们主要⽤到Matplotlib和Numpy这两个模块来为⼤家演⽰Python强⼤的绘图功能,相信⼤家通过我下⾯的10个⽰例,基本上可以满⾜⼤家⽇常⼯作的需求,再次强调⼀下,只是简单的⽤法,⼤家千万不要想通过这篇博客获取到太⾼深的⽤法。
下⾯进⼊正题1、绘制⼀条直线代码如下,下⾯的代码⼤家应该都可以看懂吧# 导⼊常⽤的包import numpy as npimport matplotlib.pyplot as plt# ⽣成-1到1的数据,⼀共⽣成100个,也可以⽣成1到-1的数据,这些数据是平均分布的# 定义x轴的数据x = np.linspace(-1,1,100)# 定义y轴的数据y = x * 2 + 100plt.plot(x,y)# 显⽰图像plt.show()效果如下2、创建⼀个画布,同时设置该画布的⼤⼩代码如下import numpy as npimport matplotlib.pyplot as pltx = np.linspace(-1,1,100)y1 = x * 2 + 100y2 = x ** 2# 创建⼀个画布# figsize:设置画布的⼤⼩plt.figure(figsize=(2,2))plt.plot(x,y1)# 创建第⼆个画布plt.figure()plt.plot(x,y2)plt.show()效果如下,会同时显⽰两张画布3、在⼀张画布中画两条线,同时可以设置线的颜⾊,宽度,和风格代码如下import numpy as npimport matplotlib.pyplot as pltx = np.linspace(-1,1,100)y1 = x * 2 + 0.5y2 = x ** 2# color:表⽰设置线的颜⾊# linewidth:表⽰设置线的宽度# linestyle:表⽰设置线的风格plt.figure(figsize=(2,2))plt.plot(x,y1,color='r',linewidth=1.0,linestyle='--')plt.plot(x,y2,color='b',linewidth=5.0,linestyle='-')plt.show()# 上⾯的效果就是2条曲线被放到⼀个画布中效果如下4、限制x轴,y轴的显⽰范围,为x轴和y轴添加描述,替换x轴和y轴的显⽰信息代码如下import numpy as npimport matplotlib.pyplot as plt# 设置坐标轴x = np.linspace(-3,3,100)y1 = x * 2 + 0.5y2 = x ** 2plt.figure(figsize=(6,6))plt.plot(x,y1,color='r',linewidth=1.0,linestyle='--')plt.plot(x,y2,color='b',linewidth=5.0,linestyle='-')# 限制x轴的显⽰范围plt.xlim((-1,2))# 限制y轴的显⽰范围plt.ylim((-1,5))# 给x轴加描述plt.xlabel("xxxxxx")# 给y轴加描述plt.ylabel("yyyyyy")# 替换⼀下横坐标的显⽰temp = np.linspace(-2,2,11)plt.xticks(temp)# 替换纵坐标的标签,⽤level0代替之前的-1plt.yticks([-1,0,1,2,3,4,5],["level0","level1","level2","level3","level4","level5","level6"]) plt.show()效果如下5、对边框进⾏设置,调整x轴和y轴的位置代码如下import numpy as npimport matplotlib.pyplot as plt# 设置坐标轴x = np.linspace(-3,3,100)y1 = x * 2 + 0.5y2 = x ** 2plt.figure(figsize=(6,6))plt.plot(x,y1,color='r',linewidth=1.0,linestyle='--')plt.plot(x,y2,color='b',linewidth=5.0,linestyle='-')# 限制x轴的显⽰范围plt.xlim((-1,2))# 限制y轴的显⽰范围plt.ylim((-1,5))# 给x轴加描述plt.xlabel("xxxxxx")# 给y轴加描述plt.ylabel("yyyyyy")# 替换⼀下横坐标的显⽰temp = np.linspace(-2,2,11)plt.xticks(temp)# 替换纵坐标的标签,⽤level0代替之前的-1# plt.yticks([-1,0,1,2,3,4,5],["level0","level1","level2","level3","level4","level5","level6"]) # 获取边框ax = plt.gca()# 设置右边框的颜⾊为红⾊ax.spines["right"].set_color("r")# 去掉上边框ax.spines["top"].set_color(None)# 把x轴的刻度设置为bottomax.xaxis.set_ticks_position("bottom")# 把y轴的客户设置为leftax.yaxis.set_ticks_position("left")# 设置x和y交汇的点,x轴是0,y是也是0,也就是x轴和y轴的都是0点交汇ax.spines["bottom"].set_position(("data",0))ax.spines["left"].set_position(("data",0))plt.show()效果如下6、为画布添加图例代码如下#Auther Bob#--*--conding:utf-8 --*--import numpy as npimport matplotlib.pyplot as plt# 设置图例x = np.linspace(-3, 3, 100)y1 = x * 2 + 0.5y2 = x ** 2plt.figure(figsize=(6, 6))# ⾸先要为两条线分别取名,这⾥的逗号必须要有l1, = plt.plot(x, y1, color='r', linewidth=1.0, linestyle='--')l2, = plt.plot(x, y2, color='b', linewidth=5.0, linestyle='-')# handles控制图例中要说明的线# labels为两条线分别取⼀个label# loc控制图例的显⽰位置,⼀般⽤best,由代码为我们选择最优的位置即可plt.legend(handles=[l1, l2], labels=["test1", "test2"], loc='best')# 限制x轴的显⽰范围plt.xlim((-1, 2))# 限制y轴的显⽰范围plt.ylim((-1, 5))# 给x轴加描述plt.xlabel("xxxxxx")# 给y轴加描述plt.ylabel("yyyyyy")# 替换⼀下横坐标的显⽰temp = np.linspace(-2, 2, 11)plt.xticks(temp)# 替换纵坐标的标签,⽤level0代替之前的-1plt.yticks([-1, 0, 1, 2, 3, 4, 5], ["level0", "level1", "level2", "level3", "level4", "level5", "level6"]) # 为图像加⼀个图例,⽤来对图像做说明plt.show()效果如下7、为图像添加描述代码如下import numpy as npimport matplotlib.pyplot as plt# 为图像做标注x = np.linspace(-3,3,100)y1 = x * 2# y2 = x ** 2plt.figure(figsize=(6,6))plt.plot(x,y1,color='r',linewidth=1.0,linestyle='-')# 给x轴加描述plt.xlabel("xxxxxx")# 给y轴加描述plt.ylabel("yyyyyy")# ======================================================# 在x轴为x0,y轴为x0 * 2上画⼀个点,这个点的颜⾊是红⾊,⼤⼩为50,这个⼤⼩就是这个点显⽰的⼤⼩x0 = 0.5y0 = x0 * 2# scatter是画点的⽅法plt.scatter(x0,y0,color='g',s=50)# 画线# 这条线是第⼀个点的坐标为[x0,y0],第⼆个点的坐标为[x0,-6],后⾯就是设置线的风格,线的颜⾊,线的宽度plt.plot([x0,x0],[y0,-6],color='k',linestyle='--',linewidth=1.0)# 画箭头和描述# xy代表我们的点# xytext代码我们描述的位置,基于当前的点,在x轴+30,在y轴-30# r'$2*x={n}$是我们要显⽰的⽂字信息,格式必须要这样# textcoords表⽰作为起点# fontsize表⽰设置字体⼤⼩# arrowprops设置箭头# arrowstyle设置箭头的样式# connectionstyle设置风格.2表⽰弧度plt.annotate(r'$2*0.5={n}$'.format(n = y0),xy=(x0,y0),xytext=(+30,-30),textcoords='offset points',fontsize=10,arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2')) # 显⽰⽂字描述,从x轴为-1,y轴为2开始显⽰,$$中就是要显⽰的字符,这⾥如果要显⽰空格,则需要转义# fontdict设置字体plt.text(-1,2,r'$1\ 2\ 3\ 4$',fontdict={"size":16,"color":"r"})# =========================================================# 为图像加⼀个图例,⽤来对图像做说明plt.show()效果如下8、绘制散点图代码如下import numpy as npimport matplotlib.pyplot as plt# 绘制散点图# plt.scatter(np.arange(1,10,1),np.arange(10,19,1))# plt.scatter(np.linspace(-3,3,10),np.linspace(-3,3,10)) x = np.random.normal(1,10,500)y = np.random.normal(1,10,500)print(x)# s设置点的⼤⼩# c是颜⾊# alpha是透明度plt.scatter(x,y,s=50,c='b',alpha=0.5)plt.show()效果如下9、绘制直⽅图代码如下import numpy as npimport matplotlib.pyplot as plt# 绘制直⽅图x = np.arange(10)y = x ** 2 + 10# facecolor设置柱体的颜⾊# edgecolor设置边框的颜⾊plt.bar(x,y,facecolor='g',edgecolor='r')# 绘制翻转过来的直⽅图# plt.bar(x,-y)#显⽰⽂字for x,y in zip(x,y):plt.text(x,y,"{f}".format(f=y),ha="center",va='bottom') plt.show()效果如下10、⼀张画布显⽰多张图像代码如下#Auther Bob#--*--conding:utf-8 --*--import numpy as npimport matplotlib.pyplot as plt# plt.figure()# 有⼀个两⾏两列的单元格,这个位于第⼀个单元格# plt.subplot(2,2,1)# 画⼀条【0,0】-----》【1,1】的直线# plt.plot([0,1],[0,1])# 有⼀个两⾏两列的单元格,这个位于第⼀个单元格# plt.subplot(2,2,2)# 画⼀条【0,0】-----》【1,1】的直线# plt.plot([0,1],[0,1])# 有⼀个两⾏两列的单元格,这个位于第⼀个单元格# plt.subplot(2,2,3)# 画⼀条【0,0】-----》【1,1】的直线# plt.plot([1,0],[0,1])# plt.show()# 上⾯的例⼦,每张图他显⽰的⼤⼩是⼀样的,我们想显⽰不同的⼤⼩该怎么办?plt.figure()# 有⼀个两⾏三列的单元格,这个位于第⼀个单元格plt.subplot(2,1,1)# 画⼀条【0,0】-----》【1,1】的直线plt.plot([0,1],[0,1])# 有⼀个两⾏三列的单元格,这个位于第四个单元格,因为第⼀个单元格占了3个位⼦,所以这⾥就是第四个plt.subplot(2,3,4)# 画⼀条【0,0】-----》【1,1】的直线plt.plot([0,1],[0,1])# 有⼀个两⾏三列的单元格,这个位于第五个单元格plt.subplot(2,3,5)# 画⼀条【0,0】-----》【1,1】的直线plt.plot([1,0],[0,1])plt.show()效果如下11、matplotlib模块中的颜⾊和线条风格,取⾃菜鸟教程作为线性图的替代,可以通过向 plot() 函数添加格式字符串来显⽰离散值。