Scatter 散点图
本节我们将讲述各种不同的 plot 的方式. 之前我们讲到了如何 plot 线, 今天我们讲述如何 plot 散点图.
- # 首先, 先引入 matplotlib.pyplot 简写作 plt, 再引入模块 numpy 用来产生一些随机数据.
- # 生成 1024 个呈标准正态分布的二维数据组 (平均数是 0, 方差为 1) 作为一个数据集, 并图像化这个数据集.
- # 每一个点的颜色值用 T 来表示:
- import matplotlib.pyplot as plt
- import numpy as np
- n = 1024 # data size
- X = np.random.normal(0, 1, n) # 每一个点的 X 值
- Y = np.random.normal(0, 1, n) # 每一个点的 Y 值
- T = np.arctan2(Y,X) # for color value
- # 数据集生成完毕, 现在来用 scatterplot 这个点集, 鼠标点上去, 可以看到这个函数的各个 parameter 的描述, 如下图:
- # 输入 X 和 Y 作为 location,size=75, 颜色为 T,color map 用默认值, 透明度 alpha 为 50%.
- # x 轴显示范围定位 (-1.5,1.5), 并用 xtick() 函数来隐藏 x 坐标轴, y 轴同理:
- plt.scatter(X, Y, s=75, c=T, alpha=.5)
- plt.xlim(-1.5, 1.5)
- plt.xticks(()) # ignore xticks
- plt.ylim(-1.5, 1.5)
- plt.yticks(()) # ignore yticks
- plt.show()
Bar 柱状图
生成基本图形
加颜色和数据
本节我们介绍一下用 matplotib 来制作一个柱状图,
生成基本图形
向上向下分别生成 12 个数据, X 为 0 到 11 的整数 ,Y 是相应的均匀分布的随机数据. 使用的函数是 plt.bar, 参数为 X 和 Y:
- # Bar 柱状图
- # 生成基本图形
- # 向上向下分别生成 12 个数据, X 为 0 到 11 的整数 ,Y 是相应的均匀分布的随机数据.
- # 使用的函数是 plt.bar, 参数为 X 和 Y:
- import matplotlib.pyplot as plt
- import numpy as np
- 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)
- plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
- plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
- plt.xlim(-.5, n)
- plt.xticks(())
- plt.ylim(-1.25, 1.25)
- plt.yticks(())
- plt.show()
- # 这样我们就生成了下图所示的柱状图基本框架:
- # 加颜色和数据
- # 下面我们就颜色和数值进行优化. 用 facecolor 设置主体颜色, edgecolor 设置边框颜色为白色,
- # 接下来我们用函数 plt.text 分别在柱体上方 (下方) 加上数值,
- # 用 %.2f 保留两位小数, 横向居中对齐 ha='center', 纵向底部 (顶部) 对齐 va='bottom':
- import matplotlib.pyplot as plt
- import numpy as np
- 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)
- plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
- plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
- plt.xlim(-.5, n)
- plt.xticks(())
- plt.ylim(-1.25, 1.25)
- plt.yticks(())
- for x, y in zip(X, Y1):
- # ha: horizontal alignment 水平对齐
- # va: vertical alignment 垂直对齐
- plt.text(x + 0.4, y + 0.05, '%.2f' % y, ha='center', va='bottom')
- for x, y in zip(X, Y2):
- # ha: horizontal alignment
- # va: vertical alignment
- plt.text(x + 0.4, -y - 0.05, '%.2f' % y, ha='center', va='top')
- plt.show()
Contours 等高线图
contour 美: ['kɑn.t?r] 英: ['k?nt??(r)]n. 轮廓; 等高线
画等高线
添加高度数字
Contours 等高线图
- # 数据集即三维点 (x,y) 和对应的高度值, 共有 256 个点. 高度值使用一个 height function f(x,y) 生成. x, y 分别是在区间 [-3,3] 中均匀分布的 256 个值, 并用 meshgrid 在二维平面中将每一个 x 和每一个 y 分别对应起来, 编织成栅格:
- import matplotlib.pyplot as plt
- import numpy as np
- def f(x,y):
- # the height function
- return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 -y**2)
- n = 256
- x = np.linspace(-3, 3, n)
- y = np.linspace(-3, 3, n)
- X,Y = np.meshgrid(x, y)
- # 接下来进行颜色填充. 使用函数 plt.contourf 把颜色加进去, 位置参数分别为: X, Y, f(X,Y). 透明度 0.75, 并将 f(X,Y) 的值对应到 color map 的暖色组中寻找对应颜色.
- # use plt.contourf to filling contours
- # X, Y and value for (X,Y) point
- plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.hot)
- # 接下来进行等高线绘制. 使用 plt.contour 函数划线. 位置参数为: X, Y, f(X,Y). 颜色选黑色, 线条宽度选 0.5. 现在的结果如下图所示, 只有颜色和线条, 还没有数值 Label:
- # use plt.contour to add contour lines
- C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=.5)
- # 添加高度数字
- # 其中, 8 代表等高线的密集程度, 这里被分为 10 个部分. 如果是 0, 则图像被一分为二.
- # 最后加入 Label,inline 控制是否将 Label 画在线里面, 字体大小为 10. 并将坐标轴隐藏:
- plt.clabel(C, inline=True, fontsize=10)
- plt.xticks(())
- plt.yticks(())
Image 图片
随机矩阵画图
出图方式
- colorbar
- # 随机矩阵画图
- # 这一节我们讲解怎样在 matplotlib 中打印出图像. 这里我们打印出的是纯粹的数字, 而非自然图像. 我们今天用这样 3x3 的 2D-array 来表示点的颜色, 每一个点就是一个 pixel.
- import matplotlib.pyplot as plt
- import numpy as np
- a = np.array([0.313660827978, 0.365348418405, 0.423733120134,
- 0.365348418405, 0.439599930621, 0.525083754405,
- 0.423733120134, 0.525083754405, 0.651536351379]).reshape(3,3)
- # 三行三列的格子, a 代表每一个值, 图像右边有一个注释, 白色代表值最大的地方, 颜色越深值越小. 下面我们来看代码:
- plt.imshow(a, interpolation='nearest', cmap='bone', origin='lower')
- # 我们之前选 cmap 的参数时用的是: cmap=plt.cmap.bone, 而现在, 我们可以直接用单引号传入参数. origin='lower'代表的就是选择的原点的位置.
- # 出图方式
- # 我们在这个链接 可以看到 matplotlib 官网上对于内插法的不同方法的描述. 下图是一个示例:
- # 这里我们使用的是内插法中的 Nearest-neighbor 的方法, 其他的方式也都可以随意取选.
- plt.imshow(a, interpolation='nearest', cmap='bone', origin='lower'
- # colorbar
- # 下面我们添加一个 colorbar , 其中我们添加一个 shrink 参数, 使 colorbar 的长度变短为原来的 92%:
- plt.colorbar(shrink=.92)
- plt.xticks(())
- plt.yticks(())
- plt.show()
3D 数据
3D 图 投影
- # 3D 数据
- # 首先在进行 3D Plot 时除了导入 matplotlib , 还要额外添加一个模块, 即 Axes 3D 3D 坐标轴显示:
- import numpy as np
- import matplotlib.pyplot as plt
- from mpl_toolkits.mplot3d import Axes3D
- # 之后要先定义一个图像窗口, 在窗口上添加 3D 坐标轴, 显示成下图:
- fig = plt.figure()
- ax = Axes3D(fig)
- # 接下来给进 X 和 Y 值, 并将 X 和 Y 编织成栅格. 每一个 (X, Y) 点对应的高度值我们用下面这个函数来计算.
- # X, Y value
- X = np.arange(-4, 4, 0.25)
- Y = np.arange(-4, 4, 0.25)
- X, Y = np.meshgrid(X, Y) # x-y 平面的网格
- R = np.sqrt(X ** 2 + Y ** 2)
- # height value
- Z = np.sin(R)
- # 做出一个三维曲面, 并将一个 colormap rainbow 填充颜色, 之后将三维图像投影到 XY 平面上做一个等高线图. plot 3D 图像:
- ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))
- # 其中, rstride 和 cstride 分别代表 row 和 column 的跨度.
- # 投影
- # 下面添加 XY 平面的等高线:'ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap=plt.get_cmap('rainbow'))
- # zdir='z'可以选择 x,y,z
来源: http://www.bubuko.com/infodetail-2947927.html