CodeCollection2018
11/2/2018 - 2:35 PM

matplotlib使用总结

总结python库matplotlib的绘图方法和函数,流程。

matplotlib可以绘制plot折线图,scatter散点图,pie饼状图,bar条形图,barh水平条形图,堆积图stack=True,箱型图box,contour等高线图,hist直方图,这些都可以通过plt.plot()/plt.scatter()/plt.pie()/plt.bar()/plt.contour()/plt.hist()来实现。
-----------------------------------------------------------------------------
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt   #习惯用法

x = np.linspace(0, 10, 1000)
y = np.sin(x)
z = np.cos(x**2)  #原始数据,有x和y,需要能够对应起来。

plt.figure(figsize=(8,4))  #创建绘图对象
plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)  #传递绘图的x和y
plt.plot(x,z,"b--",label="$cos(x^2)$")  #b--是简易符号记号,通过ipython的plt.plot?可以查看所有配置参数
#label给所绘制的曲线一个名字,此名字在图示(legend)中显示。只要在字符串前后添加"$"符号,matplotlib就会使用其内嵌的latex引擎绘制的数学公式;color : 指定曲线的颜色;linewidth : 指定曲线的宽度
plt.xlabel("Time(s)")  #x轴标志
plt.ylabel("Volt")  #y轴标志
plt.title("PyPlot First Example")  #图表名称
plt.ylim(-1.2,1.2)  #y轴显示范围
plt.legend()  #显示图示
plt.savefig("demo.jpg")#保存为图片,一定要在show语句之前执行,否则保存的是空图。
plt.show()  #最后都会表用show来绘图
------------------------------------------------------------------------------------
在一个figure中绘制多个子图方法
import matplotlib.pyplot as plt

# 1D data
x = [1,2,3,4,5]
y = [2.3,3.4,1.2,6.6,7.0]

plt.figure(figsize=(12,6))

plt.subplot(231)
plt.plot(x,y)
plt.title("plot")

plt.subplot(232)
plt.scatter(x, y)
plt.title("scatter")

plt.subplot(233)
plt.pie(y)
plt.title("pie")

plt.subplot(234)
plt.bar(x, y)
plt.title("bar")

# 2D data
import numpy as np
delta = 0.025
x = y = np.arange(-3.0, 3.0, delta)
X, Y = np.meshgrid(x, y)
Z    = Y**2 + X**2

plt.subplot(235)
plt.contour(X,Y,Z)
plt.colorbar()
plt.title("contour")

# read image
import matplotlib.image as mpimg
img=mpimg.imread('marvin.jpg')

plt.subplot(236)
plt.imshow(img)
plt.title("imshow")

plt.savefig("matplot_sample.jpg")
------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------
plt.subplot()绘制多个子图
matplotlib所绘制的图的每个组成部分都对应有一个对象,我们可以通过调用这些对象的属性设置方法set_*或者pyplot的属性设置函数setp设置其属性值。
一幅图有许多需要配置的属性,例如颜色、字体、线型等等。我们在绘图时,并没有一一对这些属性进行配置,许多都直接采用了Matplotlib的缺省配置。Matplotlib将缺省配置保存在一个文件中,通过更改这个文件,我们可以修改这些属性的缺省值。Matplotlib 使用配置文件 matplotlibrc 时的搜索顺序如下:当前路径 : 程序的当前路径;用户配置路径 : 通常为 HOME/.matplotlib/,可以通过环境变量MATPLOTLIBRC修改;系统配置路径 : 保存在 matplotlib的安装目录下的 mpl-data 下。
matplotlib绘图使用的默认参数配置通过matplotlib.rc_params可以直接得到,是字典形式,可以直接修改从而从最底层修改绘图配置,它应该读取自配置文件。
-------------------------------------------------------------------------------------
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
在代码执行过程中,有两种方式更改参数:使用参数字典(rcParams);调用matplotlib.rc()命令 通过传入关键字元祖,修改参数。如果不想每次使用matplotlib时都在代码部分进行配置,可以修改matplotlib的文件参数:
  axex: 设置坐标轴边界和表面的颜色、坐标刻度值大小和网格的显示
  backend: 设置目标暑促TkAgg和GTKAgg
  figure: 控制dpi、边界颜色、图形大小、和子区( subplot)设置
  font: 字体集(font family)、字体大小和样式设置
  grid: 设置网格颜色和线性
  legend: 设置图例和其中的文本的显示
  line: 设置线条(颜色、线型、宽度等)和标记
  patch: 是填充2D空间的图形对象,如多边形和圆。控制线宽、颜色和抗锯齿设置等。
  savefig: 可以对保存的图形进行单独设置。例如,设置渲染的文件的背景为白色。
  verbose: 设置matplotlib在执行期间信息输出,如silent、helpful、debug和debug-annoying。
  xticks和yticks: 为x,y轴的主刻度和次刻度设置颜色、大小、方向,以及标签大小。
一个图表是由数据和绘制方法两方面构成的。图表并不等同于数据,绘制方法有可能会影响人们的主观认识。
绘图的要素有:先确定想要绘制的信息维度;每个信息维度都需要一个坐标;每一个坐标都需要有刻度;刻度还需要有范围;在维度和刻度都选取好了之后,要再坐标轴旁标注这是什么维度,维度的单位,并在坐标轴上标注刻度值;需要进一步说明数据来源;以及原始数据。
----------------------------------------------------------------
设定该图的坐标范围plt.axis([xmin,xmax,ymin,ymax]):
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from pylab import *

x = np.arange(-5.0, 5.0, 0.02)
y1 = np.sin(x)

plt.figure(1)
plt.subplot(211)
plt.plot(x, y1)

plt.subplot(212)
#设置x轴范围
xlim(-2.5, 2.5)
#设置y轴范围
ylim(-1, 1)
plt.plot(x, y1)
--------------------------------------------------------------------
一条命令绘图多条线
import numpy as np
import matplotlib.pyplot as plt

# evenly sampled time at 200ms intervals
t = np.arange(0., 5., 0.2)

# red dashes, blue squares and green triangles
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()
-----------------------------------------------------------------------
plt.figure()的作用设定图的id,大小,分辨率,背景色,边框颜色等。
import matplotlib.pyplot as plt
plt.figure(1)                # 第一张图
plt.subplot(211)             # 第一张图中的第一张子图
plt.plot([1,2,3])
plt.subplot(212)             # 第一张图中的第二张子图
plt.plot([4,5,6])


plt.figure(2)                # 第二张图
plt.plot([4,5,6])            # 默认创建子图subplot(111)

plt.figure(1)                # 切换到figure 1 ; 子图subplot(212)仍旧是当前图
plt.subplot(211)             # 令子图subplot(211)成为figure1的当前图
plt.title('Easy as 1,2,3')   # 添加subplot 211 的标题
----------------------------------------------------------------------------
设置线或图表某点的text:
import numpy as np
import matplotlib.pyplot as plt

mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)

# 数据的直方图
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='g', alpha=0.75)


plt.xlabel('Smarts')
plt.ylabel('Probability')
#添加标题
plt.title('Histogram of IQ')
#添加文字
plt.text(60, .025, r'$mu=100, sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()
-------------------------------------------------------------------------------
注释。在使用annotate时,要考虑两个点的坐标:被注释的地方xy(x, y)和插入文本的地方xytext(x, y)。
import numpy as np
import matplotlib.pyplot as plt

ax = plt.subplot(111)

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

plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),
            arrowprops=dict(facecolor='black', shrink=0.05),
            )

plt.ylim(-2,2)
plt.show()
-----------------------------------------------------------------------------------
人为设置坐标轴刻度显示的值
# 导入 matplotlib 的所有内容(nympy 可以用 np 这个名字来使用)
from pylab import *

# 创建一个 8 * 6 点(point)的图,并设置分辨率为 80
figure(figsize=(8,6), dpi=80)

# 创建一个新的 1 * 1 的子图,接下来的图样绘制在其中的第 1 块(也是唯一的一块)
subplot(1,1,1)

X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)

# 绘制余弦曲线,使用蓝色的、连续的、宽度为 1 (像素)的线条
plot(X, C, color="blue", linewidth=1.0, linestyle="-")

# 绘制正弦曲线,使用绿色的、连续的、宽度为 1 (像素)的线条
plot(X, S, color="r", lw=4.0, linestyle="-")

plt.axis([-4,4,-1.2,1.2])
# 设置轴记号

xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
       [r'$-pi$', r'$-pi/2$', r'$0$', r'$+pi/2$', r'$+pi$'])
#就是在x轴刻度范围内的[-np.pi, -np.pi/2, 0, np.pi/2, np.pi]四处,要显示[r'$-pi$', r'$-pi/2$', r'$0$', r'$+pi/2$', r'$+pi$']这种效果。
yticks([-1, 0, +1],
       [r'$-1$', r'$0$', r'$+1$'])
# 在屏幕上显示
show()
------------------------------------------------------------------
plt.legend()设置在plot中设置的label参数在图中显示的位置
plot(X, C, color="blue", linewidth=2.5, linestyle="-", label="cosine")
plot(X, S, color="red",  linewidth=2.5, linestyle="-", label="sine")
legend(loc='upper left')  #在左上显示图例
--------------------------------------------------------------------
matplotlib的绘图功能与sklearn的模型预测能力结合,汇出原始数据图形和模型预测效果
# Import necessary packages
import pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('ggplot')
from sklearn import datasets
from sklearn import linear_model
import numpy as np
# Load data
boston = datasets.load_boston()
yb = boston.target.reshape(-1, 1)
Xb = boston['data'][:,5].reshape(-1, 1)
# Plot data
plt.scatter(Xb,yb)
plt.ylabel('value of house /1000 ($)')
plt.xlabel('number of rooms')
# Create linear regression object
regr = linear_model.LinearRegression()
# Train the model using the training sets
regr.fit( Xb, yb)
# Plot outputs
plt.scatter(Xb, yb,  color='black')
plt.plot(Xb, regr.predict(Xb), color='blue',
         linewidth=3)
plt.show()
-----------------------------------------------------
plt.subplot(2,3,1)表示把图标分割成2*3的网格。也可以简写plt.subplot(231)。其中,第一个参数是行数,第二个参数是列数,第三个参数表示图形的标号。
面向对象的方式绘图
fig,ax=plt.subplots(2,2,figsize=(10,10))#生成一个2行2列的空画布
ax[0][0].plot(x)
ax[0][1].hist(x)
ax[1][0].pie(np.abs(x[:5]))
--------------------------------------------------------------
fig=plt.figure(figsize=(10,10))
ax1=fig.add_subplot(2,2,1)
ax2=fig.add_subplot(2,2,2)
ax3=fig.add_subplot(2,1,2)
ax1.plot(x)
ax2.plot(np.abs(x[:4]))
ax1.axhline(-20,color='r',lw=0.51)#插入直线
---------------------------------------------------------------
# 以面向对象的方式绘图
from matplotlib.figure import Figure
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas

fig    = Figure()
canvas = FigureCanvas(fig)

# first axes
ax1    = fig.add_axes([0.1, 0.1, 0.2, 0.2])  #rect=[左, 下, 宽, 高]设定各个坐标系统在整个Figure的位置
line,  = ax1.plot([0,1], [0,1])
ax1.set_title("ax1")

# second axes
ax2    = fig.add_axes([0.4, 0.3, 0.4, 0.5])
sca    = ax2.scatter([1,3,5],[2,1,2])
ax2.set_title("ax2")

canvas.print_figure('demo.jpg')
列索引为图例,行索引为横坐标,值为纵坐标
fig, axes = plt.subplots(2, 1)
data = Series(np.random.rand(16), index=list('abcdefghijklmnop'))
data.plot(kind='bar', ax=axes[0], color='k', alpha=0.7)
data.plot(kind='barh', ax=axes[1], color='k', alpha=0.7)
--------------------- --------------------------------------------
pandas中的DataFrame或Series可以直接调用plot方法来绘图,这是包装matplotlib的plot方法的。
pd = pd.read_csv('flights.csv')     #导入数据(注意观察数据格式)
number = pd["passengers"].groupby([pd["year"],pd["month"]]).sum().unstack()
number.plot(kind="bar",figsize=(23,8))
----------------------------------------------------------------------
df = pd.read_excel('./pandas-matplotlib.xlsx','Sheet1')  #导入数据文件

fig = plt.figure()              # 创建画板
ax = fig.add_subplot(111)       # 创建绘图区域
fig.set_size_inches(10,5)       # 设置已创建画布大小
ax.hist(df['Age'],bins = 7)     # 绘制频率直方图
plt.title('年龄平均分布图')
plt.xlabel('Age')
plt.ylabel('Employee')
plt.show()
-------------------------------------------------------------------------
箱线图
np.random.seed(2)  #设置随机种子
df = pd.DataFrame(np.random.rand(5,4),
columns=['A', 'B', 'C', 'D'])#先生成0-1之间的5*4维度数据,再装入4列DataFrame中
df.boxplot(sym='r*',vert=False,patch_artist=True,meanline=False,showmeans=True)#也可用plot.box()
plt.show()
--------------------------------------------------------------------------
sale=pd.Series(np.random.random(10)*100).map(int)
tmperature=pd.Series(np.random.random(10)*10).map(int)

ax=plt.subplot(111)
sale.plot(ax=ax,color='b')
ax.set_xlabel('time')
ax.set_ylabel('sale')

#twinx 或者 twiny 函数
ax2 = ax.twinx()
tmperature.plot(ax=ax2,color='r')
ax2.set_ylabel('tmperature')
plt.title('double series figure')
绘制双y轴坐标图

--------------------------------------------------
import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
中文显示问题