Python可视化 | matplotlib绘图学习

matplotlib是最常用的Python包的二维图形,它提供了一种非常快速的方式来从Python可视化数据和以多种格式发布质量数据。
英文教程:Matplotlib: Python plotting — Matplotlib 2.2.2 documentation
中文教程:Matplotlib 中文用户指南 3.1 pyplot 教程 - CSDN博客
Matplotlib安装使用与详细解读,轻松学Matplotlib入门教程-Matplotlib中文文档

Matplotlib总体来说包含两类元素:

  • 基础类:线line、点marker、文字text、图例legend、网格grid、标题title、图片image
  • 容器类:图figure、坐标系axes、坐标轴axis、刻度tick

1.matplotlib.pyplot.plot()函数

pyplot是matplotlib的面向对象的绘图库,plot()是一个通用命令,可接受任意数量的参数。

import matplotlib.pyplot as plt

# 设置格式样例
print(plt.style.available)
matplotlib.style.use('bmh')
# 设置中文识别
matplotlib.rcParams['font.sans-serif'] = ['SimHei']

# 1.如果提供单个列表或数组,则matplotlib假定它是一个y值序列,并自动生成x值。由于python 范围从 0 开始,默认x向量具有与y相同的长度,因此x数据是[0,1,2,3]
plt.plot([1,2,3,4])
# 2.绘制x和y
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
# 3."b-"、"ro"、"r--"、"bs"、"g^"表示图形颜色和线条类型
# 4.linewidth 设置线宽
plt.plot([1,2,3,4], [1,4,9,16], 'ro',linewidth=2.0)
# 5.axis()命令接收[xmin,xmax,ymin,ymax],指定x,y轴区域范围
plt.axis([0, 6, 0, 20])
# 6.设置标签xlabel()x轴添加文字,ylabel()y轴添加文字,text()任意位置添加文字
plt.ylabel('some numbers', fontsize=14, color='red')
# 7.显示网格
plt.grid(True)

plt.show()

2.标注文本

text()基本命令将文本放置在轴域的任意位置,annotate()方法提供标注。 在标注中,有两个要考虑的点:由参数xy表示的标注位置和xytext表示的文本位置。 这两个参数都是(x, y)元组。

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = ax.plot(t, s, lw=2)

ax.annotate('标注', xy=(2,1), xytext=(3,1.5),arrowprops=dict(facecolor='black', shrink=0.05),)

ax.set_ylim(-2,2)
plt.show()

3.基本图形

3.1 饼图

import matplotlib.pyplot as plt
import matplotlib

# 设置中文识别
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
# 设置可以显示负数
matplotlib.rcParams['axes.unicode_minus'] = False

# labels  (每一块)饼图外侧显示的说明文字
labels=['第一部分','第二部分','第三部分','第四部分'] 
# (每一块)的比例
sizes=[15,20,55,10] 
colors=['yellowgreen','gold','lightskyblue','lightcoral']
# explode (每一块)离开中心距离
explode=[0,0.1,0,0]
# shadow  是否阴影
# autopct 控制饼图内百分比设置,可以使用format字符串或者format function ,'%1.1f'指小数点前后位数(没有用空格补齐)

# 画饼图用到的方法为:matplotlib.pyplot.pie()
plt.pie(sizes,explode=explode,labels=labels,colors=colors,autopct='%1.1f%%',shadow=True,startangle=50)
# 设置横轴和纵轴大小相等,这样饼才是圆的
plt.axis('equal')
# 设置注释
plt.legend()
plt.show()

3.2 堆叠条形图

import matplotlib.pyplot as plt
import matplotlib

# 横轴名称
label_list = ['2014', '2015', '2016', '2017']
# 第一堆叠值
num_list1 = [20, 30, 15, 35]
# 第二堆叠值
num_list2 = [15, 30, 40, 20]

x = range(len(num_list1))
rects1 = plt.bar(x, height=num_list1, width=0.45, alpha=0.8, color='red', label="一部门")
rects2 = plt.bar(x, height=num_list2, width=0.45, color='green', label="二部门", bottom=num_list1)
plt.ylim(0, 80)
# 纵轴
plt.ylabel("数量")
plt.xticks(x, label_list)
# 横轴
plt.xlabel("年份")
# 标题
plt.title("某某公司")
# 显示注释
plt.legend()
plt.show()

3.3 水平条形图

import matplotlib.pyplot as plt
import matplotlib

price = [39.5, 39.9, 45.4, 38.9, 33.34]

# 绘制水平条形图方法barh()
plt.barh(range(5), price, height=0.7, color='steelblue', alpha=0.8)
#从下往上画
plt.yticks(range(5), ['亚马逊', '当当网', '中国图书网', '京东', '天猫'])
# 设置图形起始值
plt.xlim(30,47)
plt.xlabel("价格")
plt.title("不同平台图书价格")
for x, y in enumerate(price):
    plt.text(y + 0.2, x - 0.1, '%s' % y)
plt.show()

3.4 条形图

import matplotlib.pyplot as plt
import matplotlib

label_list = ['2014', '2015', '2016', '2017'] # 横坐标刻度显示值
num_list1 = [20, 30, 15, 35]  # 纵坐标值1
num_list2 = [15, 30, 40, 20]  # 纵坐标值2
x = range(len(num_list1))
"""
绘制条形图
left:长条形中点横坐标
height:长条形高度
width:长条形宽度,默认值0.8
label:为后面设置legend准备
"""
rects1 = plt.bar(x, height=num_list1, width=0.4, alpha=0.8, color='red', label="一部门")
rects2 = plt.bar([i + 0.4 for i in x], height=num_list2, width=0.4, color='green', label="二部门")
plt.ylim(0, 50)     # y轴取值范围
plt.ylabel("数量")
"""
设置x轴刻度显示值
参数一:中点坐标
参数二:显示值
"""
plt.xticks([index + 0.2 for index in x], label_list)
plt.xlabel("年份")
plt.title("某某公司")
plt.legend() # 设置题注
# 编辑文本
for rect in rects1:
    height = rect.get_height()
    plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom")
for rect in rects2:
    height = rect.get_height()
    plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom")

plt.show()

3.5 直方图

import matplotlib.pyplot as plt
import numpy as np
import matplotlib

# 随机生成(10000,)服从正态分布的数据
data = np.random.randn(10000)

"""
绘制直方图
data:必选参数,绘图数据
bins:直方图的长条形数目,可选项,默认为10
normed:是否将得到的直方图向量归一化,可选项,默认为0,代表不归一化,显示频数。normed=1,表示归一化,显示频率。
facecolor:长条形的颜色
edgecolor:长条形边框的颜色
alpha:透明度
"""
plt.hist(data, bins=20, normed=0, facecolor="green", edgecolor="black", alpha=0.7)
# 显示横轴标签
plt.xlabel("区间")
# 显示纵轴标签
plt.ylabel("频数/频率")
# 显示图标题
plt.title("频数/频率分布直方图")
plt.show()

3.6 折线图

import matplotlib.pyplot as plt

x1=range(0,10) 
x2=range(0,10) 
y1=[10,13,5,40,30,60,70,12,55,25]
y2=[5,8,0,30,20,40,50,10,40,15] 
plt.plot(x1,y1,label='第一条线',linewidth=2,color='r',marker='o',markerfacecolor='blue',markersize=12) 
plt.plot(x2,y2,label='第二条线') 
plt.xlabel('Plot Number') 
plt.ylabel('Important var') 
plt.title('有趣的图形') 
plt.legend() 
plt.show()

3.7 散点图

import matplotlib.pyplot as plt

population_ages = [22,55,62,45,21,22,34,42,42,4,99,102,
                   110,120,121,122,130,111,115,112,80,75,
                   65,54,44,43,42,48]
x=range(0,len(population_ages))
plt.scatter(x,population_ages,label='第一变量',s=20)
# help(plt.scatter)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck it out')
plt.legend()
plt.show()

3.8 自定义函数

import matplotlib.pyplot as plt
import numpy as np

# 从[-1,1]中等距去50个数作为x的取值
x = np.linspace(0, 10, 50)
# 一次函数
y1 = 2*x + 1
# 二次函数
y2 = 2**x + 1
# 三次函数
y3 = 2**x*x + 1
# 第一个是横坐标的值,第二个是纵坐标的值
# plt.plot(x, y)

# 注意,每次调用figure的时候都会重新申请一个figure对象
plt.figure()
# 第一个是横坐标的值,第二个是纵坐标的值
plt.plot(x, y1)

# 第一个参数表示的是编号,第二个表示的是图表的长宽
plt.figure(num = 3, figsize=(6, 5))
# 当我们需要在画板中绘制两条线的时候,可以使用下面的方法:
plt.plot(x, y2)
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')
# 设置轴线的lable(标签)
plt.xlabel("I am x")

plt.show()

3.9 3D数据图

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(12, 8))
ax = Axes3D(fig)

# 生成X,Y
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X,Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)

# height value
Z = np.sin(R)

# 绘图
# rstride(row)和cstride(column)表示的是行列的跨度
ax.plot_surface(X, Y, Z, 
                rstride=1,  # 行的跨度
                cstride=1,  # 列的跨度
                cmap=plt.get_cmap('rainbow')  # 颜色映射样式设置
               )

# offset 表示距离zdir的轴距离
ax.contourf(X, Y, Z, zdir='z', cmap='rainbow')
ax.set_zlim(-2, 2)

plt.show()

3.10 Subplot多合一显示

import matplotlib.pyplot as plt
import numpy as np

plt.figure()
# 将整个figure分成两行两列
plt.subplot(2, 2, 1)
# 第一个参数表示X的范围,第二个是y的范围
plt.plot([0, 1], [0, 1])

plt.subplot(222)
plt.plot([0, 1], [0, 2])

plt.subplot(223)
plt.plot([0, 1], [0, 3])

plt.subplot(224)
plt.plot([0, 1], [0, 4])

plt.show()

3.11 subplot2grid分格显示

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.gridspec as gridspec

plt.figure()
# 第一个元素表示将总的面板进行划分,划分为3行3列,
# 第二个元素表示该面板从0行0列开始,列的跨度(colspan)为3列,行的跨度(rowspan)为1
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3, rowspan=1)
# 第一个元素的表示X的范围为[1,2],第二个元素表示Y的范围为[1,2]
ax1.plot([1, 2], [1, 2])
ax1.set_title(r'$ax1\_title$')
# 第一个元素表示将总的面板进行划分,划分为3行3列,
# 第二个元素表示该面板从1行0列开始,列的跨度(colspan)为2列,行的跨度(rowspan)取默认值1
ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2)
ax2.set_title(r'$ax2\_title$')
# 第一个元素表示将总的面板进行划分,划分为3行3列,
# 第二个元素表示该面板从1行2列开始,行的跨度(rowspan)为2列,列的跨度(colspan)取默认值1
ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)
ax3.set_title(r'$ax3\_title$')
# 第一个元素表示将总的面板进行划分,划分为3行3列,
# 第二个元素表示该面板从2行0列开始,行的跨度(rowspan)为2列,列的跨度(colspan)取默认值1
ax4 = plt.subplot2grid((3, 3), (2, 0))
ax4.set_title(r'$ax4\_title$')
# 第一个元素表示将总的面板进行划分,划分为3行3列,
# 第二个元素表示该面板从2行1列开始,行的跨度(rowspan)为2列,列的跨度(colspan)取默认值1
ax5 = plt.subplot2grid((3, 3), (2, 1))
ax5.set_title(r'$ax5\_title$')

plt.tight_layout()
plt.show()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,000评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,745评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,561评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,782评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,798评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,394评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,952评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,852评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,409评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,483评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,615评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,303评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,979评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,470评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,571评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,041评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,630评论 2 359

推荐阅读更多精彩内容