Matplot绘图
导包:from matplotlib import pyplot as plt
常用方法:
show():一般在最后面做图形显示,plt.show()
plot():功能是传递数据,让其绘制图形,并且返回的是一个Line2D对象(每条线一个)
如果接受的不是列表,只是值,就只会画点
from matplotlib import pyplot as plt
import numpy as np
plt.plot(1, 2, "ro")
plt.show()
如果接受的数据是一个一维列表,默认会使用索引作为横坐标,元素值作为纵坐标
from matplotlib import pyplot as plt
plt.plot([1, 2, 4, 9, 5, 3])
plt.show()
如果接受的数据是两个一维列表,第一个列表元素值作为横坐标,第二个列表元素值作为纵坐标,而且两个值一一对应,形成一个一个坐标点一样
from matplotlib import pyplot as plt
plt.plot([1, 2, 3, 4, 5], [5, 4, 3, 2, 1])
plt.show()
如果使用其他包生成数据较为方便,如numpy
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(-5, 5, 1000) # linspace()的功能是在指定区间取n个等分点
y = x**2
plt.plot(x, y)
plt.show()
如果接受的数据是有三个参数,前两个参数和上面一样,第三个参数是线条的样式,又或者是接受的数据是三个三个出现,每三个就会组成一组, 或者分开写效果也是一样的,并且能为每条线设置成不同的样式,如线宽set_linewidth(),虚线风格set_dash_capstyle(),alpha级别(透明图)set_alpha()
from matplotlib import pyplot as plt
line1, line2 = plt.plot([1, 2, 3, 4, 5], [5, 4, 3, 2, 1], "g--", [5, 4, 3, 2, 1], [1, 2, 3, 4, 5], "r-")
line1.set_linewidth(3.0)
line1.set_dash_capstyle("round")
line2.set_alpha(0.5) # 范围值0-1
plt.axis([0, 7, -2, 7])
plt.show()
axis():坐标轴刻度根据数据范围自动匹配,想要让图形显示在更大的空间中可以通过调用 axis 函数指定每个坐标轴的范围,参数含义: [xmin, xmax, ymin, ymax]
from matplotlib import pyplot as plt
plt.plot([1, 2, 3, 4, 5], [5, 4, 3, 2, 1])
plt.axis([0, 7, -2, 7])
plt.show()
title():在图表中增加标题,参数描述见例忘意
xlabel()、ylabel():在图表坐标轴上添加描述,参数描述见例忘意
grid():图表背景是否是格子的,默认为False
savefig():保存图像
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(-5, 5, 1000) # linspace()的功能是在指定区间取n个等分点
y = x**2
plt.plot(x, y)
plt.title("Square Function", fontsize=20)
plt.xlabel("X", fontsize=16)
plt.ylabel("y = $x^2$", fontsize=16) # 里面的$就是解析^的,显示更为美观
plt.grid(True)
plt.savefig("my_square_function.png", transparent=True)
plt.show()
subplot():添加子图。第一个参数表示几行,第二个参数表示几列,第三个参数表示第几个(先从左到右,后从上到下)
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(-1.5, 1.5, 50)
plt.figure(figsize=(10, 10))
plt.subplot(3, 2, 1) # subplot(3, 2, 1)可以简写subplot(321)
plt.plot(x, x)
plt.subplot(3, 2, 2)
plt.plot(x, x**2)
plt.subplot(3, 2, 3)
plt.plot(x, x**3)
plt.subplot(3, 2, 4)
plt.plot(x, x**4)
plt.subplot(3, 1, 3) # 这样会将上面两行各看成一个
plt.plot(x, np.sin(3*x))
plt.show()
subplot2grid():如果需要更复杂的子图位置设置,可以使用subplot2grid函数代替subplot函数。先指定图形(figure)网格的行数和列数,然后指定子图(是指原有的子图,不算合并的子图)的位置(左上角位置为(0, 0)),然后根据需求设置子图需要占用的行数和列数。
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(-1.5, 1,5, 50)
plt.figure(figsize=(8, 6))
# (3, 3)有9个子图,rowspan表示跨行,colspan表示跨列
plt.subplot2grid((3,3), (0, 0), rowspan=2, colspan=2)
plt.plot(x, x**2)
plt.subplot2grid((3,3), (0, 2))
plt.plot(x, x**3)
plt.subplot2grid((3,3), (1, 2), rowspan=2)
plt.plot(x, x**4)
plt.subplot2grid((3,3), (2, 0), colspan=2)
plt.plot(x, x**5)
plt.show()
figure():如果还想再原有的图像上添加线条,就可以指定figure
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(-1.4, 1.4, 30)
plt.figure(1) # 第一块图像(可以说第一个结果)
plt.subplot(211)
plt.plot(x, x**2)
plt.title("Square and Cube")
plt.subplot(212)
plt.plot(x, x**3)
plt.figure(2, figsize=(10, 5)) #第二块图像(可以说第二结果)
plt.subplot(121)
plt.plot(x, x**4)
plt.title("y = x**4")
plt.subplot(122)
plt.plot(x, x**5)
plt.title("y = x**5")
plt.figure(1) # 指定第一块图像,但是是在212图表中画线条
plt.plot(x, -x**3, "r:")
plt.show()
text():绘制文本。前两个值表示文本显示的坐标点,第三个参数是文本内容,之后的参数是文本约束。掌握这种就行,其他的花里胡哨以后用到在
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(-1.5, 1.5, 50)
px = 0.8
py = px ** 2
plt.plot(x, x**2, "b-", px, py, "ro")
# ha表示horizontalalignment
plt.text(0, 1.5, "Square Function\ny = $x^2$", fontsize=20, color="blue", ha="center")
# weight表示字体粗细
plt.text(px-0.08, py, "Beautiful point", ha="right", weight="heavy")
plt.text(px, py-0.3, "x = %0.2f\ny = %0.2f" % (px, py), rotation=50, color="gray")
plt.show()
legend(loc=“best”):为线条增加图例。需要在绘制线条的过程中增加一个label属性
from matplotlib importpyplot as plt
import numpy as np
x = np.linspace(-1.5, 1.5, 50)
plt.plot(x, x**2, "g--", label="y = $x^2$")
plt.plot(x, x**3, "b-", label="y = $x^3$")
plt.legend(loc="best")
plt.show()
Matplotlib支持非线性缩放,例如对数曲线或分对数缩放(不常用,不做解释)
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(0.1, 15, 500)
y = x**3/np.exp(2*x)
plt.figure(1)
plt.plot(x, y)
plt.yscale('linear')
plt.title('linear')
plt.grid(True)
plt.figure(2)
plt.plot(x, y)
plt.yscale('log')
plt.title('log')
plt.grid(True)
plt.figure(3)
plt.plot(x, y)
plt.yscale('logit')
plt.title('logit')
plt.grid(True)
plt.figure(4)
plt.plot(x, y - y.mean())
plt.yscale('symlog', linthreshy=0.05)
plt.title('symlog')
plt.grid(True)
plt.show()
极坐标:只需在创建‘subplot’是设置projection属性为polar即可。(不常用,不做解释)
from matplotlib import pyplot as plt
import numpy as np
radius = 1
theta = np.linspace(0, 2*np.pi*radius, 1000)
alpha = np.linspace(0, 2*np.pi, 100)
plt.subplot(111, projection='polar')
plt.plot(alpha, np.cos(5*alpha))
# plt.plot(theta, np.sin(5*theta), "g-")
# plt.plot(theta, 0.5*np.cos(4*theta), "b-")
# plt.plot(alpha, alpha)
plt.show()
3D图形:你需要导入Axes3D,Axes3D包含了3d图形。然后创建一个subplot设置‘projection’属性为‘3d’。这会返回一个Axes3DSubplot对象,你可以通过调用plot_surface设置x,y,z坐标增加可选的属性。(不常用, 不做解释)
import matplotlib
from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
R = np.sqrt(X**2 + Y**2)
Z = np.cos(R*2)
figure = plt.figure(1, figsize=(12, 4))
subplot3d = plt.subplot(111, projection="3d")
surface = subplot3d.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=matplotlib.cm.coolwarm, linewidth=0.1)
plt.show()
scatter():散点图绘制。前两个参数是点显示的坐标位置,s表示大小,c表示颜色,alpha表示透明度,edgcolor表示边框颜色
from numpy.random import rand
from matplotlib import pyplot as plt
for color in ["red", "green", "blue", "pink"]:
# rand功能:第一个参数表示返回值的个数,第二个参数表示一个返回值的元素有多少个,元素值都在0-1
# randn功能:一样,元素值是从标准正态分布中获取
x, y, w = rand(3, 100)
w = 500 * w**5
plt.scatter(x, y, s=w, c=color, alpha=0.5, edgecolors="blue")
plt.grid(True)
plt.show()
hist():绘制直方图的使用。第一个参数是python基础教程一系列的数据,第二个参数是这些数据定义一个一个范围,第三个参数就是柱子的宽度。绘制的直方图就是对范围的统计数
from matplotlib import pyplot as plt
from numpy.random import rand
data = list(map(lambda x: int(x), rand(1, 10)[0]*40))
print(data)
plt.subplot(211)
plt.hist(data, bins=10, rwidth=0.8)
plt.subplot(212)
plt.hist(data, bins=[0, 8, 16, 24, 32, 40], rwidth=0.95)
plt.show()
直方图的另一种表现形式
from matplotlib import pyplot as plt, animation
import numpy as np
data1 = np.random.randn(400)
data2 = np.random.randn(500) + 3
data3 = np.random.randn(450) + 6
data4a = np.random.randn(200) + 9
data4b = np.random.randn(100) + 10
plt.hist(data1, bins=5, color='g', alpha=0.75, label='bar hist')
# default histtype='bar'
plt.hist(data2, color='b', alpha=0.65, histtype='stepfilled', label='stepfilled hist')
plt.hist(data3, color='r', histtype='step', label='step hist')
plt.hist((data4a, data4b), color=('r', 'm'), alpha=0.55, histtype='barstacked', label=('barstacked a', 'barstacked b'))
plt.xlabel("Value")
plt.ylabel("Frequency")
plt.legend()
plt.grid(True)
plt.show()