目录

一、对Matplotlib图形结构的认识

二、Matplotlib绘图设置主要方法

1、Matplotlib绘制普通折线图

(1) 设置折现颜色、形状、折点样式

(2) 设置图片大小并保存

(3) 绘制x轴和y轴的刻度

(4) 中文正常显示设置

(5) 一图多线

(6)标出图中某些特定点

(7)移动坐标轴的位置

2、绘制散点图

3、绘制条形图(竖)

4、绘制条形图(横)

5、绘制条形图(并列)

6、绘制条形图(堆积)

7、绘制饼图

8、直方图

9、散点图

10、不同坐标轴(极坐标、对数坐标)

11、一图多个子图

三、用Matplotlib绘图总结

Matplotlib是一个Python2D绘图库,它可用于Python脚本、Python和IPython shell、JupyterNotebook、Web应用程序服务器和四个图形用户界面工具包。

Matplotlib绘图非常方便,只需几行代码即可生成直方图、饼图、散点图等常见图形。

本文主要总结了Matplotlib绘图中的一些常用方法,把用Matplotlib绘制常见统计图做一个汇总,解决了中文字符无法正常显示问题,并可以根据需要一张图显示不同字体。

一、对Matplotlib图形结构的认识

通常,可将一张Matplotlib图像分成三层结构:

第一层:底层容器曾,主要包括Canvas、Figure、Axes;

第二层:辅助显示层,主要包括axis、spines、grid、legend、title等;

第三层:图像层,即通过plot、scatter等方法绘制的图像。

二、Matplotlib绘图设置主要方法

1、Matplotlib绘制普通折线图

使用默认设置生成的折线图,缺乏美感。下面就来一步步的美化。

说一下,可以不加%matplotlib inline 这一句,如果不加这一句,只是首次启动jupyternotebook需要运行两次才会显示出图像,后面都正常。

from matplotlib import pyplot as plt

%matplotlib inline

x = range(1,8) # x轴的位置

y = [17, 17, 18, 15, 11, 11, 13]

plt.plot(x,y)

plt.show()

(1) 设置折现颜色、形状、折点样式

x = range(1,8) # x轴的位置

y = [17, 17, 18, 15, 11, 11, 13]

plt.plot(x,y,color='red',alpha=0.5,linewidth=3,linestyle=':',marker='*',markersize='20',markeredgecolor='g',markeredgewidth = 2)

plt.show()

color=‘red’:折线颜色

alpha=0.5:折线透明度(0-1)

linewidth=3:折线宽度

linestyle=’:’:折线线的样式

marker=’*’:折点样式

markersize=‘20’:折点大小

markeredgecolor=‘g’:折点边缘颜色

markeredgewidth = 2:折点边缘线宽度

(2) 设置图片大小并保存

from matplotlib import pyplot as plt

import random

x = range(2,28,2)

y = [random.randint(15,30) for i in x]

#设置图片大小

plt.figure(figsize=(20,8),dpi=80)

plt.plot(x,y)

#plt.show()

#保存图片

plt.savefig('./t1.png')

figsize:指定figure的宽和高,单位为英寸;

dpi:图画的分辨率,缺省值为80

注意:保存要放在绘制的下面,并且plt.show()会释放figure资源,如果在plt.show()之后保存图片,将只能保存空图片。

图片也可以保存成svg这种矢量图格式,这种矢量图在网页中放大后不会有锯齿。

(3) 绘制x轴和y轴的刻度

坐标轴刻度不用x、y的默认值,可用plt.xticks()、plt.yticks()来设置,其中rotation=45是让文字旋转45度

from matplotlib import pyplot as plt

import random

x = range(2,15,2)

y = [random.randint(15,30) for i in x]

#设置图片大小

plt.figure(figsize=(10,8),dpi=80)

#构造x轴刻度标签

x_ticks_label = ['{};00'.format(i) for i in x]

plt.xticks(x,x_ticks_label,rotation = 45)

#设置y轴刻度标签

y_ticks_label = ['{}℃'.format(i) for i in range(min(y),max(y)+1)]

plt.yticks(range(min(y),max(y)+1),y_ticks_label)

#绘图

plt.plot(x,y)

plt.show()

(4) 中文正常显示设置

matplotlib只显示英文,中文显示为‘口’,网上常见的设置方法都过于复杂,比较实用的一种方法是

plt.rcParams[‘font.sans-serif’]=[‘SimHei’] # 用来正常显示中文标签

plt.rcParams[‘axes.unicode_minus’]=False # 用来正常显示负号

但是这种设置出的中文通篇都是一种字体,无法个性化设置,比如标题一种字体,轴坐标一种字体。

我的方法可以设置多个字体、字号,只需要过matplotlib下的font_manager就可以解决。

首先通过路径“C:\Windows\Fonts\”查看自己Windows下的字体。

再通过font_manager.FontProperties()设置字体属性:

my_font = font_manager.FontProperties(fname=‘C:\Windows\Fonts\msyh.ttc’,size=20)

最后,设置坐标轴刻度的fontproperties属性:plt.xticks(x,fontproperties=my_font)

import matplotlib.pyplot as plt

import random

from matplotlib import font_manager

my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\msyh.ttc',size=20)

my_font1 = font_manager.FontProperties(fname='C:\Windows\Fonts\STCAIYUN.TTF',size=25)

x = range(2,14,2)

y = [random.randint(15,30) for i in x]

plt.figure(figsize=(8,4),dpi=80)

#设置X轴的刻度

x_ticks_label = ['2月{}日'.format(i) for i in x]

plt.xticks(x,x_ticks_label,fontproperties=my_font)

#设置Y轴的刻度

y_ticks_label = ['{}℃'.format(i) for i in range(min(y),max(y)+1)]

plt.yticks(range(min(y),max(y)+1,2),y_ticks_label,size=20)

plt.plot(x,y,marker='o')

plt.title('近10天最高温度',fontproperties = my_font1)

plt.show()

(5) 一图多线

通过使用多次plt.plot()达到一图多线目的:

plt.plot(x,y1,label=‘我’)

plt.plot(x,y2,label=‘同事’)

添加图例用plt.lengend()

注意:只有在图例里添加prop参数是显示中文,其他都是用fontproperties参数。loc:设置位置,有upper left、lower left、center left、upper center

import matplotlib.pyplot as plt

from matplotlib import font_manager

import random

my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\msyh.ttc',size=20)

x = range(11,31)

y1 = [random.randint(0,8) for i in x]

y2 = [random.randint(0,8) for i in x]

plt.figure(figsize=(10,5),dpi=80)

plt.plot(x,y1,label='我')

plt.plot(x,y2,label='同事')

x_ticks_label = ['{}岁'.format(i) for i in range(11,32,2)]

y_ticks_label = ['{}个'.format(i) for i in range(min(y1),max(y1)+2,2)]

plt.xticks(range(min(x),max(x)+2,2),x_ticks_label,fontproperties=my_font)

plt.yticks(range(min(y1),max(y1)+2,2),y_ticks_label,fontproperties=my_font)

plt.xlabel('年龄',fontproperties=my_font)

plt.ylabel('好友数',fontproperties=my_font)

plt.legend(prop=my_font,loc='upper right')

plt.show()

(6)标出图中某些特定点

import matplotlib.pyplot as plt

import numpy as np

#为正常显示中文字体,添加的代码

plt.rcParams['font.sans-serif']=['SimHei']

plt.rcParams['axes.unicode_minus']=False

x = np.arange(-10,10,0.1)

plt.plot(x,x**2,'r.-',label='y=x**2')

plt.annotate("Important value", (0,0), xycoords='data',

xytext=(8, 38),

arrowprops=dict(arrowstyle='->'))

plt.title("测试一些函数")

plt.legend() #显示图例

plt.xlabel('x value')

plt.ylabel('y value')

plt.show()

import matplotlib.pyplot as plt

import numpy as np

x1 = np.random.normal(30, 3, 100)

x2 = np.random.normal(20, 2, 100)

x3 = np.random.normal(10, 3, 100)

plt.plot(x1, label='plot')

plt.plot(x2, label='2nd plot')

plt.plot(x3, label='last plot')

#生成图例框

plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=1,

ncol=3, mode="expand", borderaxespad=0.)

plt.annotate("Important value", (45,20), xycoords='data',

xytext=(5, 38),

arrowprops=dict(arrowstyle='->'))

plt.show()

x = np.arange(0, 20, 0.01)

plt.plot(x, x**2)

#为正常显示中文字体,添加的代码

plt.rcParams['font.sans-serif']=['SimHei']

plt.rcParams['axes.unicode_minus']=False

#增加x、y轴文字说明

plt.xlabel("Money Earned",color='r',fontsize=20)

plt.ylabel("Consume Level")

#增加标题

plt.title("测试一些函数")

#图内文字,指定首字出现的x轴,y轴,文字本身

plt.text(2.5,100,"图内文字测试")

#箭头指示,指定文字,箭头指向的坐标,文字显示的坐标,箭头的属性

plt.annotate('最大值', xy=(20, 400), xytext=(12.5, 400),

arrowprops=dict(facecolor='black', shrink=0.05),

)

plt.grid(True) # 设置网格线

plt.show()

(7)移动坐标轴的位置

import matplotlib.pyplot as plt

import numpy as np

x = np.arange(-10,10,0.1)

#获得当前图表的图像

ax = plt.gca()

#设置图形的包围线

ax.spines['right'].set_color('none')

ax.spines['top'].set_color('none')

ax.spines['bottom'].set_color('blue')

ax.spines['left'].set_color('r')

#设置底边的移动范围,移动到y轴的0位置

#‘data’:移动轴的位置到交叉轴的指定坐标

ax.spines['bottom'].set_position(('data',0))

ax.spines['left'].set_position(('data',0))

plt.plot(x,x**3,'g',label='y=x**3')

plt.legend() #显示图例

plt.show()

2、绘制散点图

import matplotlib.pyplot as plt

from matplotlib import font_manager

import random

my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\msyh.ttc',size = 18)

x = range(1,32)

y = [random.randint(11,26) for i in x]

plt.figure(figsize=(20,8),dpi=80)

plt.scatter(x,y,label='3月份温度',s=65,c='g')

x_ticks_label = ['{}日'.format(i) for i in x]

y_ticks_label = ['{}℃'.format(i) for i in range(min(y),max(y)+2,2)]

plt.xticks(x,x_ticks_label,fontproperties=my_font,rotation = 45)

plt.yticks(range(min(y),max(y)+2,2),y_ticks_label,fontproperties=my_font)

plt.title('3月份每日最高气温',fontproperties=my_font,size = 28)

plt.xlabel('月份',fontproperties=my_font,size = 23)

plt.ylabel('温度',fontproperties=my_font,size = 23)

plt.legend(prop=my_font)

plt.grid(alpha=0.5)

plt.show()

3、绘制条形图(竖)

import matplotlib.pyplot as plt

from matplotlib import font_manager

my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\msyh.ttc',size = 20)

a = ['流浪地球','疯狂的外星人','飞驰人生','大黄蜂','熊出没·原始时代','新喜剧之王']

b = ['38.13','19.85','14.89','11.36','6.47','5.93']

plt.figure(figsize=(20,8),dpi = 80)

#绘制条形图

rects = plt.bar(range(len(a)),[float(i) for i in b],width=0.3,color=['r','g','b','r','g','b'],label='票房')

plt.xticks(range(len(a)),a,fontproperties=my_font)

plt.yticks(range(0,41,5),range(0,41,5),fontproperties=my_font)

#在条形图上加标注(水平居中)

for rect in rects:

height = rect.get_height()

plt.text(rect.get_x()+rect.get_width()/2,height+0.3,str(height),ha='center',size=20)

plt.title('2019年内地票房排名',fontproperties=my_font,size = 28)

plt.legend(prop=my_font)

plt.show()

4、绘制条形图(横)

from matplotlib import pyplot as plt

from matplotlib import font_manager

my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\msyh.ttc',size=20)

a = ['流浪地球','疯狂的外星人','飞驰人生','大黄蜂','熊出没·原始时代','新喜剧之王']

b = ['38.13','19.85','14.89','11.36','6.47','5.93']

plt.figure(figsize=(20,8),dpi = 80)

rects = plt.barh(range(len(a)),[float(i) for i in b],height=0.5,color=['r','g','b','r','g','b'],label='票房')

plt.yticks(range(len(a)),a,fontproperties=my_font)

plt.xticks(range(0,41,5),range(0,41,5),fontproperties=my_font)

for rect in rects:

width = rect.get_width()

plt.text(width,rect.get_y()+0.5/2,str(width),fontproperties=my_font,va='center')

plt.show()

5、绘制条形图(并列)

import matplotlib.pyplot as plt

import numpy as np

index = np.arange(4)

BJ = [50,55,53,60]

Sh = [44,66,55,41]

rects1 = plt.bar(index,BJ,width=0.3)

rects2 = plt.bar(index+0.3,Sh,width=0.3,color='g')

plt.xticks(index+0.3/2,index)

for rect1 in rects1:

height = rect1.get_height()

plt.text(rect1.get_x()+rect1.get_width()/2,height+0.3,str(height),ha='center')

for rect2 in rects2:

height = rect2.get_height()

plt.text(rect2.get_x()+rect2.get_width()/2,height+0.3,str(height),ha='center')

plt.show()

6、绘制条形图(堆积)

import matplotlib.pyplot as plt

import numpy as np

index = np.arange(4)

BJ = [50,55,53,60]

Sh = [44,66,55,41]

rect1 = plt.bar(index,BJ,width=0.3,label='BJ')

rect2 = plt.bar(index,Sh,bottom=BJ,width=0.3,label='Sh')

plt.xticks(index,index)

for rect1 in rects1:

height = rect1.get_height()

plt.text(rect1.get_x()+rect1.get_width()/2,height/2,str(height),ha='center')

for rect2 in rects2:

height = rect2.get_height()

plt.text(rect2.get_x()-rect2.get_width()/2,height+min(BJ)-25,str(height),ha='center')

plt.legend()

plt.show()

7、绘制饼图

import matplotlib.pyplot as plt

from matplotlib import font_manager

#fname代表字体路径(本电脑中的字体路径,下载字体文件)

my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\msyh.ttc',size=10)

label_list = ['Frogs','Hogs','Dogs','Logs']

size = [15,30,45,10]

color = ['blue','yellow','green','red']

explode = [0,0.1,0,0]

plt.figure(figsize=(10,8),dpi = 80)

patches,l_text,p_text = plt.pie(size,

explode=explode,

colors=color,

labels=label_list,

labeldistance=1.1,

autopct='%1.1f%%',

shadow=True,

startangle=90,

pctdistance=0.6)

for t in l_text:

t.set_fontproperties(my_font)

for t in p_text:

t.set_size(18)

plt.legend(prop=my_font)

plt.show()

8、直方图

import matplotlib.pyplot as plt

#标准正态分布又称为μ分布,是以均数μ=0、标准差σ=1的正态分布,记为N(0,1)

mu, sigma = 0,1

x = np.random.normal(mu,sigma,10000)

n, bins, patches = plt.hist(x,bins=100,facecolor='g', alpha=0.75)

plt.text(-3, 250, r'$\mu=0,\ \sigma=1$')

plt.grid(True)

plt.show()

9、散点图

import matplotlib.pyplot as plt

import random

x = np.random.normal(0, 1, 1000) # 1000个点的x坐标

y = np.random.normal(0, 1, 1000) # 1000个点的y坐标

c = np.random.rand(1000) #1000个颜色

s = np.random.rand(100)*100 #100种大小

plt.scatter(x, y, c=c, s=s,alpha=0.5)

plt.grid(True)

plt.show()

10、不同坐标轴(极坐标、对数坐标)

from matplotlib.ticker import NullFormatter

np.random.seed(19680801)

y = np.random.normal(loc=0.5, scale=0.4, size=1000)

y = y[(y > 0) & (y < 1)]

y.sort()

x = np.arange(len(y))

plt.figure(1)

# linear

plt.subplot(221)

plt.plot(x, y)

plt.yscale('linear')

plt.title('linear')

plt.grid(True)

# log

plt.subplot(222)

plt.plot(x, y)

plt.yscale('log')

plt.title('log')

plt.grid(True)

# symmetric log

plt.subplot(223)

plt.plot(x, y - y.mean())

plt.yscale('symlog', linthreshy=0.01)

plt.title('symlog')

plt.grid(True)

# logit

plt.subplot(224)

plt.plot(x, y)

plt.yscale('logit')

plt.title('logit')

plt.grid(True)

plt.gca().yaxis.set_minor_formatter(NullFormatter())

plt.subplots_adjust(top=0.92, bottom=0.08, left=0.10, right=0.95, hspace=0.25, wspace=0.35)

plt.show()

11、一图多个子图

用add_subplot方法给figure新增子图.

import matplotlib.pyplot as plt

import numpy as np

x = np.arange(1,100)

#新建figure对象

fig = plt.figure(figsize=(20,10),dpi=80)

#新建子图1

ax1 = fig.add_subplot(2,2,1)

ax1.plot(x,x)

#新建子图2

ax2 = fig.add_subplot(2,2,2)

ax2.plot(x,x**2)

ax2.grid(color='r',linestyle='--',linewidth=1,alpha=0.3)

#新建子图3

ax3 = fig.add_subplot(2,2,3)

ax3.plot(x,np.log(x))

plt.show()

三、用Matplotlib绘图总结

python统计图的三层结构设计代码_【Python数据可视化】用Matplotlib绘制常见统计图,中文显示字体任意设置...相关推荐

  1. python打开excel执行vba代码_“Python替代Excel Vba”系列(终):vba中调用Python

    请关注本号,后续会有更多相关教程. 系列文章 学Python还不会处理Excel数据?带你用pandas玩转各种数据处理"Python替代Excel Vba"系列(二):panda ...

  2. Python之数据分析(Numpy通用属性、数据可视化与matplotlib库通用函数)

    文章目录 一.ndarray属性 二.数据可视化 一.ndarray属性 1.通用属性 dtype:数组类型 shape:数组维度 T:转置视图 ndim:维数(一维是1,二维是2,三维是3--) s ...

  3. matplotlib绘制常见统计图

    绘制折线图:plot([x], y, [fmt], data=None, **kwargs) 绘制多条线 :plot([x], y, [fmt], [x2], y2, [fmt2], -, **kwa ...

  4. 《Python数据可视化之matplotlib实践》配套代码

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx <Python数据可视化之matplotlib实践> 借助matplotlib讲解 ...

  5. 30行python代码设计_30行Python代码实现3D数据可视化

    原标题:30行Python代码实现3D数据可视化 作者:潮汐 来源:Python技术 欢迎来到 编程教室~ 我们之前的文章中有讲解过不少 Matplotlib 的用法,比如: 之前我们基本都是用它来绘 ...

  6. python数据可视化(matplotlib条形图、饼图、箱状图、直方图、折线图)(代码)

    python数据可视化(matplotlib条形图.饼图.箱状图.直方图.折线图) matplotlib(条形图) 一.简单条形图 1.简单垂直条形图 2.简单水平条形图 二.水平交错条形图 三.垂直 ...

  7. Python数据可视化——使用Matplotlib创建散点图

    Python数据可视化--使用Matplotlib创建散点图 2017-12-27 作者:淡水化合物 转载请注明网址:https://www.cnblogs.com/pengsky2016/p/812 ...

  8. python中文显示不出来_Python数据可视化利器Matplotlib,无法显示中文,怎么办?...

    原标题:Python数据可视化利器Matplotlib,无法显示中文,怎么办? matplotlib无法显示中文主要是因为默认字体不是中文字体,所以我们只需设置一下字体行了. 文字字体设置主要有两种方 ...

  9. python 数据可视化工具--matplotlib

    数据可视化工具--matplotlib 1. 条形图 1.1 垂直条形图 1.2 水平条形图 1.3 堆叠条形图 1.4 水平交错条形图 2.饼状图 3. 直方图与核密度曲线 4. 箱线图 5. 折线 ...

  10. Python计算美国总统的身高并实现数据可视化

    Python计算美国总统的身高并实现数据可视化 代码如下: import numpy as np import pandas as pd import matplotlib.pyplot as plt ...

最新文章

  1. 基于 Webpack 3 的 React 工程项目脚手架
  2. Android App 瘦身总结 第一章 图片资源的优化处理
  3. php css去除h1样式,HTML中怎么设置h1的字体样式你知道吗?
  4. Vue-cli 项目打包布署(简单清晰)
  5. Ubuntu Vi 编辑器 命令(转)
  6. 微信小程序 自定义tabBar
  7. 史上最通俗分布式锁解读
  8. python函数多次调用内存溢出_关于循环多次(具体160次左右)获取同一个句柄对象,不同实例,内存溢出的问题。...
  9. python自动化框架学习-pyautogui
  10. VS2015卸载重装之后点击没有反应
  11. 备战数学建模16-相关性分析SPSSMATLAB
  12. 基于jQuery发射弹幕的一个小案例
  13. 网页会屏蔽php代码,网站屏蔽360浏览器访问php源码js代码
  14. LiteOS 消息队列
  15. .NET框架和发展历史介绍
  16. 【xml】xml命名空间的作用(为何mybatis的xml没有命名空间)
  17. WampServer 搭建本地服务器及 XSS 基本原理和初步实践(一)
  18. 网站性能优化时Cookie常用的优化方式
  19. Edraw soft
  20. python 生信分析_用python做生物信息数据分析(2-pysam)

热门文章

  1. JSP-meta标签之详解
  2. Java — 如何产生随机数(Random类)
  3. L1-034 点赞 (20 分)—团体程序设计天梯赛
  4. Sublime Text 无法安装插件
  5. Go---第六章:方法(小知识点笔记)
  6. HBase 实战(1)--HBase的数据导入方式
  7. 多记,多问为什么,最古老的学习方法怎么能丢?!
  8. YANG-SUITE安装步骤
  9. OSPF邻接关系建立过程
  10. NYOJ--102--次方求模