Python二维绘图笔记

Python绘图--二维绘图

绘制数据图

基本绘图

plot(x,y,format_string,**kwargs)
x:x轴数据,列表或数组,可选
y:y轴数据,列表或数组
format_string:控制曲线的格式字符串,可选
**kwargs:第二组或更多,(x,y,format_string)

format_string:控制曲线的格式字符串,可选,由颜色字符、风格字符和标记字符组成。具体的设置见格式字符串设置

import matplotlib.pyplot as plt
import numpy as np
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 4, 9, 16, 25, 36, 49]
plt.plot(x, y)
[<matplotlib.lines.Line2D at 0x1a84b658>]
png
加上轴标签和标题
import matplotlib.pyplot as plt
import numpy as np
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 4, 9, 16, 25, 36, 49]
plt.title(r'$y=x^2$')
#r'$公式$'可以使用latex语法写公式
plt.xlabel('x')
plt.ylabel('y')
plt.plot(x, y)
[<matplotlib.lines.Line2D at 0x1adec7f0>]
png
将曲线方程加到曲线旁边
import matplotlib.pyplot as plt
import numpy as np
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 4, 9, 16, 25, 36, 49]
plt.text(4, 25, r'$y=x^2$')
plt.xlabel('x')
plt.ylabel('y')
plt.plot(x, y)
[<matplotlib.lines.Line2D at 0x1b5ce718>]
png
设置曲线颜色、粗细及样式
from pylab import *
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 4, 9, 16, 25, 36, 49]
plot(x, y, 'g-1')
[<matplotlib.lines.Line2D at 0x21fd0058>]
png
在一幅图上画两个函数图像
import matplotlib.pyplot as plt
import numpy as np
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 4, 9, 16, 25, 36, 49]
z = np.linspace(0, 2*np.pi, 256)
plt.plot(x, y)
plt.plot(z, z**3)
[<matplotlib.lines.Line2D at 0x1b6f9d30>]
png
设计标签

比如你画一个三角函数,想设计x轴上的标签是以π\pi为单位的

from pylab import *
x = np.linspace(0, 2*np.pi, 256)
plot(x, np.sin(x))
xticks([0, np.pi/2, np.pi, np.pi*1.5, 2*np.pi],
       [r'0', r'$\frac{\pi}{2}$', r'\pi', r'$\frac{3\pi}{2}$', r'$2\pi$'])
yticks([-1, 0, 1], ['-1', '0', '1'])
show()
png
添加图例
from pylab import *
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 4, 9, 16, 25, 36, 49]
z = np.linspace(0, 2*np.pi, 256)
plot(x, y, label=r"$y=x^2$")
plot(z, z**3, label=r"$y=x^3$")
legend()
<matplotlib.legend.Legend at 0x20dfcd60>
png

进阶绘图知识

绘制子图

subplot(a,b,c)subplot(a,b,c):在a×ba\times b的矩阵的第c个模块(行数优先从左往右)绘制图像

from pylab import *
x = np.linspace(0, 10, 100)
subplot(1, 2, 1)
plot(x, x**2)
title(r'$y=x^2$')
subplot(1, 2, 2)
plot(x, x**3)
title(r'$y=x^3$')
Text(0.5, 1.0, '$y=x^3$')
png
在图中画小图

axes([left,bottom,width,height])axes([left,bottom,width,height])

如axes(0.1,0.1,0.8,0.8)就表示里figure左边和底部都相距0.1个总长;宽和高是总长的0.8

from pylab import *
x = np.linspace(0, 10, 100)
axes1 = axes([0.1, 0.1, 0.8, 0.8])
axes1.plot(x, x**2)
axes1.text(4, 25, r'$y=x^2$')
axes2 = axes([0.2, 0.6, 0.25, 0.25])
axes2.plot(x, x**3)
axes2.text(4, 500, r'$y=x^3$')
Text(4, 500, '$y=x^3$')
png
符号函数图像的绘制(包括隐函数作图)
普通符号函数绘制
from sympy import *
x=symbols('x')
plot(x**2,(x,-1,1),title=r'y=$x^2$',xlabel='x',ylabel='y')
plot(2*x,x**2+1,(x,0,1))
#同时绘制两条曲线
png
png
<sympy.plotting.plot.Plot at 0x1bd41dd8>
隐函数绘制
from sympy import *
from sympy.parsing.sympy_parser import parse_expr  
plot_implicit(parse_expr('x**2+y**2-1'))
png
<sympy.plotting.plot.Plot at 0x1e4444a8>
from sympy import symbols
from sympy.plotting import plot3d
from sympy.functions import exp
x, y = symbols('x y')
plot3d(x*exp(-x**2-y**2), (x, -3, 3), (y, -2, 2))
png
<sympy.plotting.plot.Plot at 0x4b9ba30>

各种图形的绘制函数

散点图
scatter(x,y,s=20,c='b',maker='o',cmpa=None,norm=None,vmin=None,vax=None,alpha=None,linewidths=None,verts=None,hole=None)

x,y是相同长度的数组。

s可以是标量,或者与x,y长度相同的数组,表明散点的大小。默认20

c,即color,是点的颜色。颜色参数如下:b-blue c-cyan g-greeen k-black m-magenta r-red w-white y-yellow

marker 是散点的形状。其属性较多,'.'--点 'o'--圆圈 ','--像素 'v'--倒三角 '*'--星星

from pylab import *
x = np.random.normal(0, 1, 1024)
y = np.random.normal(0, 1, 1024)
scatter(x, y, marker=",")
<matplotlib.collections.PathCollection at 0x21f33238>
png
条形图
bar(left, height, width=0.8, bottom=None, color=None, edgecolor=None, linewidth=None, tick_label=None, xerr=None, yerr=None, label = None, ecolor=None, align, log=False, **kwargs)
x:传递数值序列,指定条形图中x轴上的刻度值

height:传递数值序列,指定条形图y轴上的高度

width:指定条形图的宽度,默认为0.8

bottom:用于绘制堆叠条形图

color:指定条形图的填充色

edgecolor:指定条形图的边框色

linewidth:指定条形图边框的宽度,如果指定为0,表示不绘制边框

tick_label:指定条形图的刻度标签

xerr:如果参数不为None,表示在条形图的基础上添加误差棒

yerr:参数含义同xerr

label:指定条形图的标签,一般用以添加图例

ecolor:指定条形图误差棒的颜色align:指定x轴刻度标签的对齐方式,默认为center,表示刻度标签居中对齐,如果设置为edge,则表示在每个条形的左下角呈现刻度标签

log:bool类型参数,是否对坐标轴进行log变换,默认为False

**kwargs:关键字参数,用于对条形图进行其他设置,如透明度等
from pylab import *

n = 12
X = np.arange(n)
Y1 = (1-X/float(n)) * np.random.uniform(0.5, 1.0, n)
Y2 = (1-X/float(n)) * np.random.uniform(0.5, 1.0, n)

bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
bar(X, -Y2, facecolor='#ff9999', edgecolor='white')

for x, y in zip(X, Y1):
    text(x, y+0.05, '%.2f' % y, ha='center', va='bottom')
for x, y in zip(X, Y2):
    text(x, -y-0.15, '%.2f' % y, ha='center', va='bottom')
ylim(-1.25, +1.25)
xticks([])
yticks([])
([], <a list of 0 Text major ticklabel objects>)
png
饼状图
pie(x, explode=None, labels=None,
    colors=('b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'),
    autopct=None, pctdistance=0.6, shadow=False,
    labeldistance=1.1, startangle=None, radius=None,
    counterclock=True, wedgeprops=None, textprops=None,
    center = (0, 0), frame = False )

参数说明:

  • x (每一块)的比例,如果sum(x) > 1会使用sum(x)归一化
  • labels (每一块)饼图外侧显示的说明文字
  • explode (每一块)离开中心距离
  • startangle 起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起
  • shadow 是否阴影
  • labeldistance label绘制位置,相对于半径的比例, 如<1则绘制在饼图内侧
  • autopct 控制饼图内百分比设置,可以使用format字符串或者format function
    '%1.1f'指小数点前后位数(没有用空格补齐)
  • pctdistance 类似于labeldistance,指定autopct的位置刻度
  • radius 控制饼图半径

返回值:

  • 如果没有设置autopct,返回(patches, texts)
  • 如果设置autopct,返回(patches, texts, autotexts)

patches -- list --matplotlib.patches.Wedge对象

texts autotexts -- matplotlib.text.Text对象

import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
labels = ['China', 'Swiss', 'USA', 'UK', 'Laos', 'Spain']
X = [222, 42, 455, 664, 454, 334]

fig = plt.figure()
plt.pie(X, labels=labels, autopct='%1.2f%%')  # 画饼图(数据,数据对应的标签,百分数保留两位小数点)
plt.show()
png

matplotlib等高线画隐函数

  • sympy虽然可以画隐函数,但不能实现两个函数图像在一张图中,而matplotlib的等高线却可以
import matplotlib.pyplot as plt
import numpy as np
#构造等高线函数
def f(x,y):
    return f(x,y)

#定义点的数量
n=500

#作点
x=np.linspace(-3,3,500)
y=np.linspace(-3,3,500)

#构造网格
X,Y=np.meshgrid(x,y)

#绘制图像
plt.contour(X,Y,f(X,Y),0)
#作其他图像
plt.plot(x,y)
plt.show()

上述函数画出f(x,y)=0的隐函数图像

import matplotlib.pyplot as plt
import numpy as np
#构造等高线函数
def f(x,y):
    return np.sin(x**2)+np.sin(y**2)-5

#定义点的数量
n=500

#作点
x=np.linspace(-3,3,500)
y=np.linspace(-3,3,500)

#构造网格
X,Y=np.meshgrid(x,y)

#绘制图像
plt.contour(X,Y,f(X,Y),0)
#作其他图像
plt.plot(x,y)
plt.show()
png