-
python的绘图包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():绘制文本。前两个值表示文本显示的坐标点,第三个参数是文本内容,之后的参数是文本约束。掌握这种就行,其他的花里胡哨以后用到在
[百度一下] https://www.baidu.com python matplot文本绘制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():绘制直方图的使用。第一个参数是一系列的数据,第二个参数是这些数据定义一个一个范围,第三个参数就是柱子的宽度。绘制的直方图就是对范围的统计数
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()
-