1.一个简单的实例
import matplotlib.pyplot as plt x = [1, 2, 3, 4] y = [5, 4, 3, 2] plt.figure() # 创建一个figure() plt.subplot(231) # divide subplots into 2*3 grid and select 1 plt.plot(x, y) plt.subplot(232) # divide subplots into 2*3 grid and select 2 plt.bar(x, y) plt.subplot(233) plt.barh(x, y) plt.subplot(234) plt.bar(x, y) y1 = [7, 8, 5, 3] plt.bar(x, y1, bottom=y, color='r') plt.subplot(235) plt.boxplot(x) plt.subplot(236) plt.scatter(x, y) plt.show()
工作原理
2.简单的正弦和余弦图
import matplotlib.pyplot as plt import numpy as np # generate uniformly distributed # 256 points from -pi to pi, inclusive x = np.linspace(-np.pi, np.pi, 256, endpoint=True) # these are vectorised versions # of math.cos, and math.sin in built-in Python maths # compute cos for every x y = np.cos(x) # compute sin for every x y1 = np.sin(x) # plot both cos and sin plt.plot(x, y) plt.plot(x, y1) plt.show()
以这个简单图表为基础,可以进一步定制化增加更多的信息,并且让坐标轴及其边界更精确些。
import matplotlib.pyplot as plt import numpy as np # generate uniformly distributed # 256 points from -pi to pi, inclusive x = np.linspace(-np.pi, np.pi, 256, endpoint=True) # these are vectorised versions # of math.cos, and math.sin in built-in Python maths # compute cos for every x y = np.cos(x) # compute sin for every x y1 = np.sin(x) # plot cos plt.plot(x, y) # plot sin plt.plot(x, y1) # define plot title plt.title("Functions $sin$ and $cos$") # set x limit plt.xlim(-3.0, 3.0) # set y limit plt.ylim(-1.0, 1.0) # format ticks at specific values plt.xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi], [r'$-pi$', r'$-pi/2$', r'$0$', r'$+pi/2$', r'$+pi$']) # 为了用希腊字母表示 plt.yticks([-1, 0, +1], [r'$-1$', r'$0$', r'$+1$']) # 为了用希腊字母表示
plt.show()
3.设置坐标轴长度和范围
import matplotlib.pyplot as plt import numpy as np # generate uniformly distributed # 256 points from -pi to pi, inclusive x = np.linspace(-np.pi, np.pi, 256, endpoint=True) # these are vectorised versions # of math.cos, and math.sin in built-in Python maths # compute cos for every x y = np.cos(x) # compute sin for every x y1 = np.sin(x) # plot both cos and sin plt.plot(x, y) plt.plot(x, y1) plt.axis([-3, 3, -1.5, 1.5]) # 设置坐标轴长度和范围 plt.show()
4.设置图表的线型、属性和格式化字符串
import matplotlib.pyplot as plt import numpy as np x = np.linspace(-np.pi, np.pi, 256, endpoint=True) y = np.cos(x) y1 = np.sin(x) plt.plot(x, y, lw=5,c='c') plt.plot(x, y1,marker='+') plt.show()
工作原理
5.折线图
5.1 坐标化成XY的对数坐标
import matplotlib.pyplot as plt import numpy as np import pandas as pd # 以下两行来显示中文 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.figure(num=1) # np.arange(20)生成数组[1..20], np.exp():返回e(2.71828182846)的幂次方 x = pd.Series(np.exp(np.arange(20))) x.plot(label=u'原始数据图', legend=True) # legend=True让label标签在子图上可见 plt.show() plt.figure(num=2) x.plot(logy=True, label=u'对数数据图', legend=True) # logy=True:y轴坐标为10的n次方 plt.show()
5.2 figure语法及操作
figure语法说明
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
num:图像编号或名称,数字为编号 ,字符串为名称
figsize:指定figure的宽和高,单位为英寸;
dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80 1英寸等于2.5cm,A4纸是 21*30cm的纸张
facecolor:背景颜色
edgecolor:边框颜色
frameon:是否显示边框
5.3 更换坐标轴
import matplotlib.pyplot as plt import numpy as np # 生成一系列数据 x = np.linspace(-1, 1, 50) y1 = x ** 2 y2 = 2 * x + 1 plt.figure(num=3, figsize=(8, 5)) plt.plot(x, y2) plt.plot(x, y1, color='red', linewidth=10, linestyle='--') # 图像的属性:颜色线宽线条样式 plt.xlim((-1, 2)) plt.ylim((-2, 3)) # 坐标轴的取值范围 plt.xlabel('I am x.') plt.ylabel('I am y.') # 坐标轴的标识 new_ticks = np.linspace(-1, 2, 5) print(new_ticks) # 打印坐标轴新的单位长度 plt.xticks(new_ticks) # 更换坐标轴的单位长度 plt.yticks(np.linspace(-2, 5, 5)) # # 更换坐标轴不同单位长度上的标识,换成文字形式 # # gca='get current axis' # ax = plt.gca() # ax.spines['right'].set_color('c') # ax.spines['left'].set_color('r') plt.show()
5.4刻度标记大小
import matplotlib.pyplot as plt # 导入模块pyplot,并给它赋别名plt,以免后续重复输入pyplot,pyplot中包含了许多用于生成图表的函数 # 简单绘图 squares = [1, 4, 9, 16, 25] # 创建一个列表,平方数 plt.plot(squares) # 再将这个列表传递给函数plot(),这个函数会根据根据这些数字绘出有意义的图 # plt.show()#打开matplotlib查看器,并显示绘制图形 # 修改标签文字和线条粗细 plt.plot(squares, linewidth=5) # linewidth决定了plot()绘制图像线条的粗细 plt.title("Square Numbers", fontsize=24) # 设置图标标题,fontsize字型大小 plt.xlabel("Value", fontsize=14) # 给x轴加标签 plt.ylabel("Square of Value", fontsize=14) # 给y轴加标签 plt.tick_params(axis='both', labelsize=10) # 设置刻度标记的大小 # tick_params设置刻度的样式,其中指定的实参将影响x轴y轴的刻度 # plt.show() # 校正图形 # 当你向plot提供一系列数据时,他假设第一个数据点对应的x坐标值为0, # 但我们第一个点对应的坐标值为1,为改变这种默认行为,我们可以给plot同时提供输入值和输出值 input_values = [1, 2, 3, 4, 5] squares = [1, 4, 9, 16, 25] plt.plot(input_values, squares, linewidth=5) plt.show()
6.散点图
6.1
import numpy as np import matplotlib.pyplot as plt x = np.arange(0., 5., 0.2) plt.plot(x, x, 'r--', x, x**2, 'bs', x, x**3, 'g^') plt.show()
6.2
import matplotlib.pyplot as plt import numpy as np n = 1024 # data size # 正太分布 X = np.random.normal(0, 1, n) Y = np.random.normal(0, 1, n) T = np.arctan2(Y, X) # 根据xy值设置颜色 plt.scatter(X, Y, s=75, c=T, alpha=.5) plt.xlim(-1.5, 1.5) plt.ylim(-1.5, 1.5) plt.show()
7.柱状图
7.1
import matplotlib.pyplot as plt import numpy as np # 12个柱状图 n = 12 X = np.arange(n) # x会生成0到11 Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n) # 随机随机生成0.5到1的数 Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n) plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white') plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white') # zip是把X,Y1中的值分别给x和y # plt.text(x位置,y位置,值) for x, y in zip(X, Y1): # ha:horizontal alignment对齐方式 plt.text(x, y + 0.05, '%.2f' % y, ha='center', va='bottom') for x, y in zip(X, Y2): # ha:horizontal alignment对齐方式 plt.text(x, -y - 0.05, '-%.2f' % y, ha='center', va='top') plt.xlim(-.5, n) plt.xticks(()) plt.ylim(-1.25, 1.25) plt.yticks(()) plt.show()
8直方图
8.1
import numpy as np import matplotlib.pyplot as plt np.random.seed(1) mu1, sigma1 = 100, 15 mu2, sigma2 = 80, 15 x1 = mu1 + sigma1 * np.random.randn(10000) x2 = mu2 + sigma2 * np.random.randn(10000) n1, bins1, patches1 = plt.hist(x1, 50, density=True, facecolor='g', alpha=1) n2, bins2, patches2 = plt.hist(x2, 50, density=True, facecolor='r', alpha=0.2) plt.rcParams['font.sans-serif'] = ['SimHei'] plt.xlabel('智商') plt.ylabel('置信度') plt.title('IQ直方图') plt.text(110, .025, r'$mu=100, sigma=15$') plt.text(50, .025, r'$mu=80, sigma=15$') # 设置坐标范围 plt.axis([40, 160, 0, 0.03]) plt.grid(True) plt.show()
9条形图
9.1平行条形图
import numpy as np import matplotlib.pyplot as plt size = 4 a = np.random.random(size) b = np.random.random(size) c = np.random.random(size) x = np.arange(size) total_width, n = 0.8, 3 width = total_width / n # redraw the coordinates of x x = x - (total_width - width) / 2 # here is the offset plt.bar(x, a, width=width, label='a') plt.bar(x + width, b, width=width, label='b') plt.bar(x + 2 * width, c, width=width, label='c') plt.legend() plt.show()
9.2堆积条形图
import numpy as np import matplotlib.pyplot as plt size = 5 a = np.random.random(size) b = np.random.random(size) c = np.random.random(size) x = np.arange(size) plt.bar(x, a, width=0.5, label='a',fc='r') plt.bar(x, b, bottom=a, width=0.5, label='b', fc='g') plt.bar(x, c, bottom=a+b, width=0.5, label='c', fc='b') plt.ylim(0, 2.5) plt.legend() # plt.grid(True) plt.show()
10.饼状图
10.1一般饼状图
import matplotlib.pyplot as plt labels = 'A', 'B', 'C', 'D' sizes = [15, 30, 45, 10] explode = (0, 0.1, 0, 0) plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=False, startangle=90) plt.axis('equal') plt.show()
10.2嵌套饼状图
import numpy as np import matplotlib.pyplot as plt size = 0.3 vals = np.array([[60., 32.], [37., 40.], [29., 10.]]) cmap = plt.get_cmap("tab20c") outer_colors = cmap(np.arange(3)*4) inner_colors = cmap(np.array([1, 2, 5, 6, 9, 10])) print(vals.sum(axis=1)) # [92. 77. 39.] plt.pie(vals.sum(axis=1), radius=1, colors=outer_colors, wedgeprops=dict(width=size, edgecolor='w')) print(vals.flatten()) # [60. 32. 37. 40. 29. 10.] plt.pie(vals.flatten(), radius=1-size, colors=inner_colors, wedgeprops=dict(width=size, edgecolor='w')) # equal makes it a perfect circle plt.axis('equal') plt.show()
10.3极轴饼状图
import numpy as np import matplotlib.pyplot as plt np.random.seed(19680801) N = 10 theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False) radii = 10 * np.random.rand(N) width = np.pi / 4 * np.random.rand(N) ax = plt.subplot(111, projection='polar') bars = ax.bar(theta, radii, width=width, bottom=0.0) for r, bar in zip(radii, bars): bar.set_facecolor(plt.cm.viridis(r / 10.)) bar.set_alpha(0.5) plt.show()
11三维图
11.1三维散点图
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D data = np.random.randint(0, 255, size=[40, 40, 40]) x, y, z = data[0], data[1], data[2] ax = plt.subplot(111, projection='3d') ax.scatter(x[:10], y[:10], z[:10], c='y') ax.scatter(x[10:20], y[10:20], z[10:20], c='r') ax.scatter(x[30:40], y[30:40], z[30:40], c='g') ax.set_zlabel('Z') ax.set_ylabel('Y') ax.set_xlabel('X') plt.show()