python-matplotlib note

2017/7/27 posted in  Python

图片都没有,很正常,我从jupyter中导出来的.粘贴到博客,还得弄图片,图片就不上传了!

matplotlib介绍

  • Python最常用的绘图库,提供了一整套十分适合交互式绘图的命令API,比较方便的就可以将其嵌入到GUI应用程序中!
  • 官网文档:http://matplotlib.org/examples/index.html

基本使用

# 导入方式为基本惯例
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

# 显示情况
#在GUI显示
#%matplotlib tk

# 在行内显示
# 默认就是这个,可以不写
%matplotlib inline 
# 画一个线性图
# 调用plot的.plot方法绘制一些坐标
# 这个.plot需要许多参数,但前两个是'x'和'y'坐标,
# 我们放入列表。 这意味着,根据这些列表我们拥有 3 个坐标:(1,5) (2,7)和(3,4)。

plt.plot([1,2,3],[5,7,4])
# 显示图片
plt.show()

png

matplotlib figure图形

figure:图形,matplotlib中的所有图像都是位于figure对象中,一个图像只能有一个figure对象。matplotlib 的 figure 就是一个 单独的 figure 小窗口, 小窗口里面还可以有更多的小图片.

x=np.arange(-3,3,0.1)
y1=np.sin(x)
y2=np.cos(x)
# 创建一个图形
plt.figure()
plt.plot(x,y1)
# 如果要创建两个单独的图形,那么就再创建一个figure
# 不然就注释这一行,则两个都显示在一个图形里面
#plt.figure(num=3,figsize=(8,5))
plt.plot(x,y2)
plt.show()

png

matplotlib-颜色,标记和线型

plot(x,y,color='red',linestyle='dashed',marker='o'...)

绘图中用到的直线属性包括:

  • LineStyle:线形
  • LineWidth:线宽
  • Color:颜色
  • Marker:标记点的形状
  • label:用于图例的标签

Plot()
绘制线条或标记轴,参数是一个可变长度参数,允许多个X,Y对可选的格式字符串

# 举例.两对坐标可以写在一个方法里面
x=np.arange(-3,3,0.1)
y1=np.sin(x)
y2=np.cos(x)
plt.plot(x,y1,x,y2)
plt.show()

png

plot(y): 如果只接收一个值,就默认是Y值,那么X默认为0到n,使用默认的线条样式和颜色

plt.plot(y1)
plt.show()

png

plt.plot([1,2,3],[5,7,4],color='red')
plt.plot([4,5,6],[5,7,7],color='green')
plt.plot([1,5,7],[5,7,7],color='blue',linestyle='dashed')
plt.plot([1,5,7],[5,7,7],color='blue',linestyle='dashed',marker='o')
plt.show()

png

# 简写
plt.plot([1,2,3],[5,7,4],'ro--')
plt.show()

png

matplotlib-刻度,标题,标签和图例

legend ():生成默认图例, matplotlib 中的 legend 图例就是为了帮我们展示出每个数据对应的图像名称. 更好的让读者认识到你的数据结构.

xlabel、ylabel:设置X轴Y轴标签
title:设置标题
xlim、ylim:控制图标的范围
xticks、yticks: 控制图标的刻度
gca获取当前坐标轴信息。使用spines设置边框,使用set_color设置边框颜色:默认白色

解决中文显示问题
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

x1 = [1,2,3]
y1 = [5,7,4]
x2 = [1,2,3]
y2 = [10,14,12]
plt.figure()
plt.plot(x1,y1,'ro--',label = 'First Line') #设置线条标签
plt.plot(x2,y2,'b-',label = 'Second Line')
#设置标题、标签
plt.xlabel('月份')#X轴标签
plt.ylabel('美元单位/亿')#Y轴标签
plt.title('进出口数据')#标题
#设置X轴范围
plt.xlim(0,6)
#设置y轴范围
plt.ylim(0,15)
#设置X轴刻度
plt.xticks(np.linspace(1,6,6),[str(i) + '月' for i in range(1,7)])
#设置y轴刻度 
plt.yticks(np.arange(0,16,3),['0','300','600','900','1200','1500'])
#获取坐标轴信息
ax = plt.gca()
#设置边框
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

#legend 生成默认图例
plt.legend()

plt.show()

png

subplot子图

x1=[1,2,3]
y1=[5,7,4]
x2=[1,2,3]
y1=[10,14,12]
plt.figure(num=1)
plt.subplot(221)
plt.plot(x1,y1,'r-')
plt.subplot(223)
plt.plot(x2,y2,'b--')

plt.show()

png

import matplotlib.pyplot as plt   
import numpy as np

# 设置在jupyter中matplotlib的显示情况

#获取figure对象
fig = plt.figure(figsize = (8,6))
#在figure上创建对象
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(212)

#在ax1上绘图
ax1.plot(np.random.randn(50).cumsum(),'g-')
#在ax2上绘图
ax2.plot(np.random.randn(50).cumsum(),'b--')
#在ax3
ax3.plot(np.random.randn(50).cumsum(),'k--')

plt.show()

png

subplots 快捷方式

Sublots():返回一个图像和多个子图
参数: nrows=x, ncols=x, sharex=True, sharey=False,
gridspec_kw={'height_ratios':[2,2,1,1]}
例:
fig, ax = plt.subplots(2,2),其中参数分别代表子图的行数和列数,一共有 2x2 个图像。函数返回一个figure图像和一个子图ax的array列表。

fig,axes=plt.subplots(2,2)
print(fig)
print(axes)
Figure(432x288)
[[<matplotlib.axes._subplots.AxesSubplot object at 0x114a9fef0>
  <matplotlib.axes._subplots.AxesSubplot object at 0x1149c9978>]
 [<matplotlib.axes._subplots.AxesSubplot object at 0x1146f7a20>
  <matplotlib.axes._subplots.AxesSubplot object at 0x1147187b8>]]

png

import matplotlib.pyplot as plt

fig, axes = plt.subplots( nrows=4, ncols=1, sharex=True, sharey=False ) #gridspec_kw={'height_ratios':[2,2,1,1]}

fig.suptitle('test', fontsize=20)#设置fig标题

axes[0].plot(range(10),'ro-') 
axes[1].plot(range(10),'bo-') 
axes[2].plot(range(10),'go-') 
axes[3].plot(range(10),'mo-') 

plt.show()

png

import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(2,2,sharex=True, sharey=True )

for i in range(2):
    for j in range(2):
        axes[i,j].hist(np.random.randn(100),10,color = 'g',alpha = 0.75)
plt.subplots_adjust(wspace = 0.3,hspace = 0.3) #调整子图之间的距离
fig.suptitle('test', fontsize=20)
#plt.savefig('aaa.png',dpi = 50)
plt.show()

png

import matplotlib.pyplot as plt
import numpy as np

x=np.arange(1,7)
y=np.random.randint(10,size=(6))
fig,ax=plt.subplots()
fig.suptitle("random num")
ax.set_title("pic1")
ax.plot(x,y)
plt.show()

png

matplotlib-柱状图

matplotlib.pyplot. bar (*args, **kwargs)
bar(x, height, width, bottom, *, align='center', **kwargs)
参数:
    x:数据标量
    height:高
    width:宽
    bottom:底端对应Y轴
    align:对齐  center居中 
    如果为 "居中", 则将x参数解释为条形中心的坐标。如果 "边缘", 将条形按其左边缘对齐要对齐右边缘的条形图, 可传递负的宽度和对align='edge'
import matplotlib.pyplot as plt
import numpy as np

plt.figure(figsize=(8,6))
plt.bar([1,3,5,7,9,11],[5,2,7,8,2,6],align = 'center',label="Example one",color = 'y',edgecolor = 'r')

plt.bar([2,4,6,8,10,12],[8,6,2,5,6,3], label="Example two", color='g')
plt.legend()
plt.xlabel('bar number')
plt.ylabel('bar height')

#设置x轴刻度标签
plt.xticks(np.arange(1,13),[str(i)+'月' for i in range(1,13)])

plt.title('')

plt.show()

png

用柱状图表示第一季度的进出口数据
进口数据:
    1月份  600亿美元
    2月份  700亿美元
    3月份  800亿美元
出口数据:
    1月份  500亿美元
    2月份  900亿美元
    3月份  1000亿美元
import matplotlib.pyplot as plt
import numpy as np

x = [1,2,3]
y1 = [600,700,800]
y2 = [500,900,1000]
plt.figure(figsize=(8,5))
plt.bar(x,y1,0.1,align = 'edge',label="进口 单位/美元",color = 'y')
plt.bar(x,y2,-0.1,align = 'edge' ,label="出口 单位/美元", color='r')

for m,n in zip(x,y1):
    plt.text(m+0.08, n+10, '%.2f' %n, ha='center', va= 'bottom')

for m,n in zip(x,y2):
    plt.text(m-0.08, n+10, '%.2f' %n, ha='center', va= 'bottom')
    
plt.legend()
plt.xlabel('第一季度/月')
plt.ylabel('进出口额/美元')

#设置x轴刻度标签
plt.xticks(np.arange(1,4),[str(i)+'月' for i in range(1,4)])

plt.title('第一季度进出口数据')

plt.show()

png

matplotlib-直方图

matplotlib.pyplot.hist(x, bins=10, range=None,normed=False, weights=None, cumulative=False,bottom=None, histtype='bar', align='mid',
                       orientation=u'vertical', rwidth=None, log=False,color=None, label=None, stacked=False, hold=None,**kwargs) 
– x: 一个列表或者多个列表(表示不同数据集,长度可以不一致)
– range: 元组
– weights: x里每个元素对bin高度的贡献(默认为1)
– bottom: 数字或者长度为bins的列表
– histtype: ['bar' | 'barstacked' | 'step' | 'stepfilled'] 
– align: ['left' | 'mid' | 'right'] 
– orientation: ['horizontal' | 'vertical'] 
– rwidth: bar相对bin的宽度
– color: 一种颜色或者颜色列表(针对不同数据集)
import matplotlib.pyplot as plt
#频率分布直方图
data = ([1,1,2,3,3,3,3,3,4,5])    
plt.hist(data,10, normed=1)
plt.show()

png

import matplotlib.pyplot as plt
import numpy as np

#展现出10000个随机数满足 平均值是100 标准差是15 呈现的一个正态分布曲线
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)

plt.hist(x, 100, normed=1, facecolor='g', alpha=0.75)

plt.title('直方图')
plt.text(60, 0.025,r'$\mu=100,\sigma=15$')#添加文本
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()

png

matplotlib-散点图

matplotlib.pyplot. scatter (x, y, s=none, c=none, marker=none, cmap= None, 
                            norm=none, vmin=none, vmax=none, alpha=none, Linewidths=none,
                            verts=none, edgecolors=none, hold=none, data= None, **kwargs)
参数:
    x,y:相同长度的数组序列
    s  :散点的大小标量或形同数组,可选参数,默认20
    c  :散点的色彩或颜色序列,可选
    maker:标记风格,可选,默认是‘o’
    norm:数据的亮度
    alpha:散点的透明度
import matplotlib.pyplot as plt
import numpy as np
x = [1,2,3,4,5,6,7,8]
y = [5,2,4,2,1,4,5,2]
T = np.random.rand(8)*125
plt.scatter(x,y, label='散点分布', c=T, s=25, marker="o",alpha = 0.5)

plt.xlabel('x')
plt.ylabel('y')
plt.title('散点图')
plt.legend()
plt.show()

png

import matplotlib.pyplot as plt
import numpy as np

plt.figure(figsize=(8,6))
n=1000
#rand 均匀分布和 randn高斯分布
x=np.random.randn(1,n)
y=np.random.randn(1,n)
T=np.arctan2(x,y) #np.random.rand(n) * 125

plt.scatter(x,y,c=T,s=30,alpha=0.4,marker='o')
#T:散点的颜色
#s:散点的大小
#alpha:是透明程度
plt.show()

png