matplotlib
基本图形
散点图
import numpy as np
import matplotlib.pyplot as plt
height=[161,170,182,175,173,165]
weight=[50,58,80,70,69,55]
plt.scatter(height,weight)
plt.show()
N=1000
x=np.random.randn(N)
y1=np.random.randn(len(x))
plt.scatter(x,y1)
plt.show()
y2=x+np.random.randn(len(x))*0.1
plt.scatter(x,y2)
y3=-1*x+np.random.randn(len(x))*0.1
plt.scatter(x,y3)
N = 1000
x = np.random.rand(N)
y = np.random.rand(N)
open,close=np.loadtxt('000001.csv',delimiter=',',skiprows=1,usecols=(1,4),unpack=True)
change=close-open
yesterday=change[:-1]
today=change[1:]
plt.scatter(today,yesterday)
plt.show()
s=200
marker='v'
c='green'
alpha=1
plt.scatter(x, y1, s=50, marker='o', c='red', alpha=0.5)
plt.show()
open,close=np.loadtxt('000001.csv',delimiter=',',skiprows=1,usecols=(1,4),unpack=True)
change=close-open
yesterday=change[:-1]
today=change[1:]
plt.scatter(yesterday,today,s=500,c='r',alpha=1)
plt.show()
折线图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
x=np.linspace(-10,10,100)
y=x**2
plt.plot(x,y)
plt.show()
date,open,close=np.loadtxt('000001.csv',delimiter=',',
converters={0:mdates.strpdate2num('%m/%d/%Y')},skiprows=1,usecols=(0,1,4),unpack=True)
plt.plot_date(date,close,'y-')
plt.show()
plt.plot_date(date,close,'go')
plt.plot_date(date,close,'r--')
plt.show()
plt.plot(date, close, color='green', linestyle='dashed', marker='o',
markerfacecolor='blue', markersize=12)
plt.show()
条形图
import numpy as np
import matplotlib.pyplot as plt
N=5
y=[20,10,30,25,15]
index = np.arange(N)
p1 = plt.bar(x=index, height=y,width=0.5,bottom=100,color='red')
plt.show()
#水平的
p2 = plt.bar(x=0, bottom=index, width=y,height=0.5,orientation='horizontal')
plt.show()
#默认画水平的图
p3=plt.barh(bottom=index,width=y,height=0.5)
plt.show()
index=np.arange(4)
sales_BJ=[52,55,63,53]
sales_SH=[44,66,55,41]
bar_width=0.3
#并列条形图
plt.bar(index,sales_BJ,bar_width,color='b')
plt.bar(index+bar_width,sales_SH,bar_width,color='r')
plt.show()
#层叠图
plt.bar(index,sales_BJ,bar_width,color='b')
plt.bar(index,sales_SH,bar_width,color='r',bottom=sales_BJ)
plt.show()
直方图
import numpy as np
import matplotlib.pyplot as plt
mu = 100 # mean of distribution
sigma = 20 # standard deviation of distribution
x = mu + sigma * np.random.randn(2000)
plt.hist(x, bins=10,color='red',normed=True)#normed 是否标准化
plt.hist(x, bins=50,color='green',normed=False)
plt.show()
#双变量的直方图
x = np.random.randn(1000)+2
y = np.random.randn(1000)+3
plt.hist2d(x, y, bins=40)
plt.show()
饼状图
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
# Some data
labels = 'A', 'B', 'C', 'D'
fracs = [15, 30, 45, 10]
explode = (0, 0.05, 0, 0)
# Make square figures and axes
plt.axes(aspect=1)
#离圆的中心
explode = (0, 0.05, 0, 0)
#plt.pie(fracs, labels=labels, autopct='%1.1f%%', shadow=True)
plt.pie(fracs, explode=explode, labels=labels, autopct='%.0f%%', shadow=True)#shadow 加阴影
plt.show()
箱形图
是一种用作显示一组数据分散情况资料的统计图。
上边缘,上四分位数,中位数,下四分位数,下边缘,异常值
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(100)
data = np.random.normal(size=1000, loc=0.0, scale=1.0)
plt.boxplot(data,sym='o',whis=1.5)#sym 异常的点的形状 whis 虚线的长度
plt.show()
data = np.random.normal(size=(100, 4), loc=0.0, scale=1.0)
labels = ['A','B','C','D']
plt.boxplot(data, labels=labels)
plt.show()
颜色和样式
颜色
1.八种内建默认颜色缩写
b:blue
g:green
r:red
c:cyan 青色
m:magenta 紫色
y:yellow
k:black
w:white
2.其他颜色表示方法:
灰色阴影
html十六进制
RGB元组
#调整颜色
y=np.arange(1,5)
plt.plot(y,'y');
plt.plot(y+1,color=(0.1,0.2,0.3));
plt.plot(y+2,'#FF00FF');
plt.plot(y+3,color='0.5')#灰度
plt.show()
点,线的样式
#线型
y=np.arange(1,5)
plt.plot(y,'--');
plt.plot(y+1,'-.');
plt.plot(y+2,':');
plt.show()
'''
#点形状
'''
y=np.arange(1,5)
plt.plot(y,'o');
plt.plot(y+1,'D');
plt.plot(y+2,'^');
plt.plot(y+3,'s');
plt.plot(y+4,'p');
plt.plot(y+5,'x');
plt.show()
样式字符串
可以将颜色,点型,线型写成一个字符串,如:
cx–
mo:
kp:
y=np.arange(1,5)
plt.plot(y,'cx--');
plt.plot(y+1,'kp:');
plt.plot(y+2,'mo-.');
plt.show()
面向对象VS Matlab Sytle
pyplot :经典高层封装,到目前为止,我们所用的都是pyplot
pylab: 将Matplotlib 和 NumPy 合并的模块,模拟Matlab的编程环境
面向对象的方式:Matplotlib的精髓,更基础和底层的方式
三种方式优劣:
pyplot :简单易用。交互使用时方便,可以根据命令实时作图。但底层定制能力不足。
pylab: 完全封装,环境最接近Matlab。不推荐使用。
面向对象(Object-Oriented)的方式:接近Matplotlib基础和底层的方式。难度稍大。但定制能力强。而且是Matplotlib的精髓。
总结:实战中推荐,根据需求,综合使用 pyplot和OO的方式,显示导入numpy
常用模块导入代码:
import matplotlib.pyplot as plt
import numpy as np
#pyplot
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10,1)
y=np.random.randn(len(x))
plt.plot(x,y)
plt.title('pyplot')
plt.show()
#pylab
from pylab import *
x=arange(0,10,1)
y=randn(len(x))
plot(x,y)
title('random numbers')
show()
#Object Oriented
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10,1)
y=np.random.randn(len(x))
fig=plt.figure()
ax=fig.add_subplot(111)
l,=plt.plot(x,y)
t=ax.set_title('object oriented')
plt.show()
子图
Matplotlib对象简介
FigureCanvas
Figure
Axes
实例
fig=plt.figure()
Figure实例
可以添加Axes实例
ax=fig.add_subplot(111)
返回Axes实例
参数一,子图总行数
参数二,子图总列数
参数三,子图位置
在Figure上添加Axes的常用方法
import matplotlib.pyplot as plt
import numpy as np
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.show()
多图
可以创建多个Figure
import matplotlib.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()
网格
import numpy as np
import matplotlib.pyplot as plt
y=np.arange(1,5)
plt.plot(y,y*2)
plt.grid(True)
plt.show()
#交互中打开关闭网格
plt.grid()
import numpy as np
import matplotlib.pyplot as plt
y=np.arange(1,5)
plt.plot(y,y*2)
plt.grid(True,color='g',linestyle='-',linewidth='2')
plt.show()
#Object Oriented
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10,1)
y=np.random.randn(len(x))
fig=plt.figure()
ax=fig.add_subplot(111)
l,=plt.plot(x,y)
ax.grid(color='g')
plt.show()
图例
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(1,11,1)
y=x*x
plt.plot(x,x*2,label='Normal')
plt.plot(x,x*3,label='Fast')
plt.plot(x,x*4,label='Faster')
plt.legend(loc=3,ncol=2)#loc,ncol指定位置和列
plt.show()
#方式2
plt.plot(x,x*2)
plt.plot(x,x*3)
plt.plot(x,x*4)
plt.legend(['Normal','Fast','Faster'])
plt.show()
#OO
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10,1)
y=np.random.randn(len(x))
fig=plt.figure()
ax=fig.add_subplot(111)
l,=plt.plot(x,y)
ax.legend(['ax legend'])
line, =ax.plot(x,y,label='Inline label')
line.set_label('label via method')
ax.legend()
plt.show()
坐标轴
坐标轴范围
plt.axis()–输出(横坐标最小值,横坐标最大值,纵坐标最小值,纵坐标最大值)
可通过plt.axis([-5,5,20,60])调整
或者通过plt.xlim([-10,10])
plt.ylim([0,60])
plt.xlim(xmin=-5)
坐标轴刻度
import matplotlib.pyplot as plt
import numpy as np
import datetime
x=np.arange(1,11,1)
ax=plt.plot(x,x)
ax=plt.gca()
ax.locator_params(nbins=20)#坐标轴有多少格
#ax.locator_params('x',nbins=20)#指定调整x轴
start=datetime.datetime(2015,1,1)
stop=datetime.datetime(2016,1,1)
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='')
plt.show()
date_format=mpl.dates.DateFromatter('%Y-%m-%d')
ax.xaxis.set_major_formatter(date_format)
fig.autofmt_xdate()
plt.show()
添加坐标轴
plt.twinx() 默认0-1
plt.twiny() 共享y 轴