python数据可视化笔记(二)

Matplotlib有以下重要对象:

figure (画布),ax (坐标系),axis (坐标轴)
后面的例子会用到这些对象。

文章目录

\color{#0FACAA}{子图subplot}
\color{#0FDC0A}{生成多个figure}
\color{#0DDC41}{网格}
\color{#0FFFFA}{图例}
\color{#0AAAAA}{坐标轴范围}
\color{#0BBBBB}{坐标轴刻度}
\color{#0CCCCC}{添加坐标轴}
\color{#0DDDDD}{添加注释}
\color{#0FAC0A}{添加文字}
\color{#EE1FFF}{显示数学公式}
\color{#0EE234}{区域填充}
\color{#0FFAA2}{生成形状}
\color{#0FAC0A}{样式美化}
\color{#ACACAC}{极坐标}
\color{#FDBDBF}{坐标轴标注}

数学公式编辑可参考官方文档:
mathtext

如果因为参数缺少说明或代码注释不到位导致理解困难的话非常抱歉~推荐一个视频教程,有很多笔记源于上面的教程(2016年的),有不清楚的地方也可以去上面的教程看一看~


子图subplot

面向对象式编程

import numpy as np
from matplotlib import pyplot as plt
'''
ax1=fig.add_subplot(221)
参数:
第一个参数是fig对象每行拥有的子图总数
第二个参数是fig对象每列拥有的子图总数
第三个参数是子图的位置

返回值:返回Axes实例
'''
x=np.arange(1,100)
fig=plt.figure()
axl=fig.add_subplot(221)
axl.plot(x,x)

ax2=fig.add_subplot(222)
ax2.plot(x,-x)

ax3=fig.add_subplot(223)
ax3.plot(x,x**2)

ax4=fig.add_subplot(224)
ax4.plot(x,np.log(x))
plt.show()

交互式编程

import numpy as np
from matplotlib import pyplot as plt

X=np.arange(1,100)

plt.subplot(221)
plt.plot(X,X)

plt.subplot(222)
plt.plot(X,-X)

plt.subplot(223)
plt.plot(X,X*X)

plt.subplot(224)
plt.plot(X,np.log(X))

交互式编程意思是可以输入命令即使得到反馈,可以看到效果,和命令行类似,如下图,输入plt.grid(True)便可以给当前子图设置网格


01
1

生成多个figure

import numpy as np
from matplotlib import pyplot as plt

fig1=plt.figure()

ax1=fig1.add_subplot(111)

ax1.plot([1,2,3],[3,2,1])

fig2=plt.figure()

ax2=fig2.add_subplot(111)

ax2.plot([1,2,3],[1,2,3])

plt.show()
2

网格

import numpy as np
from matplotlib import pyplot as plt

X=np.arange(0,10,1)

fig=plt.figure()

ax=fig.add_subplot(111)

plt.plot(X,X*2)

ax.grid(color='r',linestyle='-.',linewidth='2')  #设置网格属性

plt.show()
3

图例

Matplotlib.legend()设置图例,有两个常用的参数,loc是图例在图像中的位置,ncol为显示图例的列数,比如MatPlotlib.legend(loc=4,ncol=3)

loc Value
0 智能位置
1 右上角
2 左上角
3 左下角
4 右下角
import numpy as np
from matplotlib import pyplot as plt

X=np.arange(1,100)

plt.plot(X,X*2,label='Normal')
plt.plot(X,X*3,label='Fast')
plt.plot(X,X*4,label='Faster')
plt.legend(loc=1,ncol=3)
plt.show()
4
#面向对象的方式:
import numpy as np
from matplotlib import pyplot as plt

X=np.arange(1,100)

fig=plt.figure()

ax=fig.add_subplot(111)

l=plt.plot(X,X,label='label')

ax.legend()
#ax.legend(['ax legend'])

plt.show()


坐标轴范围

用plt.axis()调整坐标轴范围,参数是一个列表,比如plt.axis([-10,10,0,100])表示-10\leqx \leq 10, 0 \leqy \leq 100
也可以用plt.xlim()和plt.ylim()分别调整x轴和y轴范围,指定参数时,比如plt.xlim(xmin=6),则只调整x轴左边。

import numpy as np
from matplotlib import pyplot as plt

X=np.arange(-10,11,1)

fig=plt.figure()
ax=fig.add_subplot(111)
l=plt.plot(X,X*X)
plt.axis([-6,6,10,60])
#plt.xlim(-6,6)
#plt.xlim(xmin=-6)


plt.show()
5

坐标轴刻度

import numpy as np
from matplotlib import pyplot as plt

x=np.arange(-10,11,1)

plt.plot(x,x)

ax=plt.gca()  #获取当前图像的坐标轴

ax.locator_params(nbins=10)   #(版本不同,效果有细微差别)把坐标轴8等份,因为坐标轴两边-10,10还有空白,加起来就10份了

#也可以指定某个轴,比如:ax.locator_params('x',nbins=10)
plt.show()
6

显示日期

import numpy as np
from matplotlib import pyplot as plt
import datetime
import matplotlib as mpl
fig=plt.figure()

#设置日期序列
start=datetime.datetime(2018,9,30)
stop=datetime.datetime(2019,9,30)

delta=datetime.timedelta(days=1)

dates=mpl.dates.drange(start,stop,delta)

y=np.random.rand(len(dates))

ax=plt.gca()

ax.plot_date(dates,y,linestyle='-',marker='')

#设置日期显示格式(x轴显示格式)
date_format=mpl.dates.DateFormatter('%Y-%m-%d')

ax.xaxis.set_major_formatter(date_format)
#使x轴显示的日期自适应窗口大小
fig.autofmt_xdate()

plt.show()

7

添加坐标轴

双y轴

import numpy as np
from matplotlib import pyplot as plt

x=np.arange(2,20,1)

y1=x*x

y2=np.log(x)

fig=plt.figure()

ax1=fig.add_subplot(111)

ax1.plot(x,y1)

ax1.set_ylabel('Y1')

ax2=ax1.twinx()  #ax2和ax1共x轴

ax2.plot(x,y2,'r')

ax2.set_ylabel('Y2')

ax1.set_xlabel('Compare Y1 and Y2')

plt.show()
8

添加注释

import numpy as np
from matplotlib import pyplot as plt

x=np.arange(-10,11,1)

y=x*x

plt.plot(x,y)
'''
参数:
xy为箭头头部的坐标
xytext为箭头尾部(文字)的坐标
arrowprops指定箭头的属性
其中facecolot是箭头颜色,frac是箭头占整个箭头符号的比例
headwidth为箭头头部的宽度,width为键身的宽度
'''
plt.annotate('this is the bottom',xy=(0,4),xytext=(0,30),
             arrowprops=dict(facecolor='g',frac=0.2,headwidth=30,width=18))

plt.show()
9

添加文字

import numpy as np
from matplotlib import pyplot as plt

x=np.arange(-10,11,1)

y=x*x

plt.plot(x,y)
'''
plt.text()参数:
前面两个数字是要显示文字的起始坐标
'y=x*x'是要显示的文字
family可以设置字体,
常用字体包括:‘serif’, ‘sans-serif’, ‘cursive’, ‘fantasy’, or ‘monospace’
style设置风格,比如斜体
weight设置字体粗细(这个参数可以是数字0~1000,也可以是文字:ultralight,light,normal,regular,book,medium,roman,semibold,demibold,demi,bold,heavy,extra bold,black)
bbox设置一个矩形框包住要显示的文字,其中alpha是透明度
'''
plt.text(-1,40,'y=x*x',family='fantasy',size=20,color='r',style='italic',weight='demi',
         bbox=dict(facecolor='r',alpha=0.2))

plt.show()
10

显示数学公式

公式参考:mathtext

import numpy as np
from matplotlib import pyplot as plt

fig=plt.figure()

ax=fig.add_subplot(111)

ax.set_xlim([1,7])

ax.set_ylim([1,5])

#数学公式书写要用$$包括
ax.text(2,3,r'$\sin(0)=\cos(\frac{\pi}{2})$',size=30)

plt.show()
11

区域填充

填充与x轴围成的区域

import numpy as np
from matplotlib import pyplot as plt

x=np.linspace(0,5*np.pi,1000)

y1=np.sin(x)

y2=np.sin(2*x)

# plt.plot(x,y1)
# plt.plot(x,y2)

# alpha是透明度,'b'是蓝色,'r'是红色
plt.fill(x,y1,'b',alpha=0.3)

plt.fill(x,y2,'r',alpha=0.3)

plt.show()
12

填充两条线之间的区域

import numpy as np
from matplotlib import pyplot as plt

x=np.linspace(0,5*np.pi,1000)

y1=np.sin(x)

y2=np.sin(2*x)

# plt.plot(x,y1)
# plt.plot(x,y2)

fig=plt.figure()

ax=plt.gca()

ax.plot(x,y1,color='r')
ax.plot(x,y2,color='black')
#因为x取值是离散的,所以当x间距较大时,可能会出现空白区域,参数 interpolate设为True的意义就是让这些空白区域也可以显色
ax.fill_between(x,y1,y2,where=y1>y2,facecolor='yellow',interpolate=True)
ax.fill_between(x,y1,y2,where=y2>y1,facecolor='r',interpolate=True)

plt.show()
13

生成形状

import numpy as np
from matplotlib import pyplot as plt
import matplotlib.patches as mpatches

'''
fig, ax = plt.subplots()等价于fig, ax = plt.subplots(ncols=1, nrows=1)
等价于
fig=plt.figure()
ax=ax = fig.add_subplot(111)
'''
fig,ax=plt.subplots()

'''
使用array()函数可以将列表转化为数组

'''
xy1=[0.2,0.2]
#xy1=np.array([0.2,0.2])
xy2=np.array([0.2,0.8])
xy3=np.array([0.8,0.2])
xy4=np.array([0.8,0.8])

circle=mpatches.Circle(xy1,0.05)
ax.add_patch(circle)

rect=mpatches.Rectangle(xy2,0.2,0.1,color='r')
ax.add_patch(rect)

ellipse=mpatches.Ellipse(xy4,0.4,0.2,color='y')
ax.add_patch(ellipse)

# 第二个参数设为5表示边数为5,0.1表示图形中心到顶点的距离(类比圆的半径)
polygon=mpatches.RegularPolygon(xy3,5,0.1,color='g')
ax.add_patch(polygon)

#设置横纵坐标比例相等,否则会显示椭圆
plt.axis('equal')

#添加网格
plt.grid()

plt.show()
14

更多的形状


样式美化

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import patches as mpatches
'''
# print(plt.style.available)  #样式
返回:
['bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-bright', 
'seaborn-colorblind', 'seaborn-dark-palette', 'seaborn-dark', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 
'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks',
 'seaborn-white', 'seaborn-whitegrid', 'seaborn', 'Solarize_Light2', 'tableau-colorblind10', '_classic_test']
'''

#设置样式:
plt.style.use('dark_background')

fig,axes=plt.subplots(ncols=2 , nrows=2)

ax1, ax2, ax3, ax4 = axes.ravel()

x, y = np.random.normal(size=(2,100))
ax1.plot(x,y,'o')

x=np.arange(0,10)
y=np.arange(0,10)

# # plt.rcParams['axes.color_cycle'] 为默认的颜色循环
# ncolors=len(plt.rcParams['axes.color_cycle'])

#获取颜色循环
colors = [color['color'] for color in list(plt.rcParams['axes.prop_cycle'])]


shift=np.linspace(0,10,7)

for s in shift:
    ax2.plot(x,y+s,'-')

x=np.arange(5)
y1,y2,y3=np.random.randint(1,25,size=(3,5))
width=0.25

ax3.bar(x,y1,width)
ax3.bar(x+width,y2,width,color=colors[1])
ax3.bar(x+2*width,y2,width,color=colors[2])

for  color in colors:
    xy=np.random.normal(size=2)
    ax4.add_patch(plt.Circle(xy,radius=0.3,color=color))

ax4.axis('equal')
ax4.grid()

plt.show()


15

极坐标

import numpy as np
from matplotlib import pyplot as plt

r=np.arange(1,6,1)

theta=[np.pi*i/2 for i in range(5)]

#设置极坐标系
ax=plt.subplot(111,projection='polar')

ax.plot(theta,r,color='r',linewidth=3)

ax.grid(True)

plt.show()

16

'''
2019-10-15更新
'''

坐标轴标注

我们有时需要标注x轴是什么,y轴是什么,还需要给x,y轴设置标签,比如下面的例子:

import numpy as np
from matplotlib import pyplot as plt
def func(x):
    return -(x-3)*(x-7)+9

x=np.linspace(0,10)
y=func(x)

fig,ax=plt.subplots()

plt.plot(x,y,'r',linewidth=2)
a=2
b=8

ax.set_xticks([a,b])  # 设置x标签
ax.set_yticks([])     # 设置y标签(这里为空)

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

推荐阅读更多精彩内容