欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 Python之数据分析(三维立体图像、极坐标系、半对数坐标)

程序员文章站 2022-05-07 16:21:07
文章目录写在前面:一、三维立体图像1、三维线框2、三维曲面3、三维散点二、极坐标系三、半对数坐标写在前面:import numpy as npimport matplotlib.pylab as mp因此文章中的np就代表numpy库,mp就代表pylab绘图库一、三维立体图像导入类:from mpl_toolkits.mplot3d import axes3d获得三维坐标轴:ax = mp.gca(projection=‘3d’)1、三维线框格式:ax.plot_wireframe...

写在前面:

import numpy as np
import matplotlib.pylab as mp
因此文章中的np就代表numpy库,mp就代表pylab绘图库

一、三维立体图像

  • 导入类:from mpl_toolkits.mplot3d import axes3d
  • 获得三维坐标轴:ax = mp.gca(projection=‘3d’)

1、三维线框

  • 格式:ax.plot_wireframe(x, y, z, rstride=行距, cstrid=列距, linewidth=线宽, color=颜色)
  • 测试代码:
import numpy as np
import matplotlib.pylab as mp
from mpl_toolkits.mplot3d import axes3d

n = 1000
# 栅格化:两组1000个-3到3的一维数组成x和y,会形成1000*1000个焦点的二维数组
x, y = np.meshgrid(np.linspace(-3, 3, n),
                   np.linspace(-3, 3, n))

# uniform:均匀分布,每个随机数概率一样在0.5和1.0之内产生n个随机数
y1 = (1 - x/n) * np.random.uniform(0.5, 1.0, n)  # (1 - x/n)为了方便显示
y2 = (1 - x/n) * np.random.uniform(0.5, 1.0, n)
z = (1 - x/2 + x**5 + y**3) * \
    np.exp(-x**2 - y**2)
# 换行做运算需要用\隔开,exp是底数为x指数是-x**2 - y**2


# 图像属性
mp.figure("3D Wireframe")

# 创建3D坐标轴
ax = mp.gca(projection='3d')

mp.title("3D Wireframe", fontsize=20)  # 图像标题

# X、Y、Z坐标轴文本
ax.set_xlabel('X', fontsize=14)
ax.set_ylabel('Y', fontsize=14)
ax.set_zlabel('Z', fontsize=14)

mp.tick_params(labelsize=10)  # 刻度标签大小

# 绘制三维线框图像
ax.plot_wireframe(x, y, z, rstride=30, cstride=30, linewidth=0.5, color='orangered')


mp.show()
  • 测试效果
    荐
                                                        Python之数据分析(三维立体图像、极坐标系、半对数坐标)

2、三维曲面

  • 格式:ax.plot_surface(x, y, z, rstride=行距, cstrid=列距, cmap=颜色映射)
  • 测试代码:
import numpy as np
import matplotlib.pylab as mp
from mpl_toolkits.mplot3d import axes3d

n = 1000
# 栅格化:两组1000个-3到3的一维数组成x和y,会形成1000*1000个焦点的二维数组
x, y = np.meshgrid(np.linspace(-3, 3, n),
                   np.linspace(-3, 3, n))

# uniform:均匀分布,在0.5和1.0之内产生n个随机数
y1 = (1 - x/n) * np.random.uniform(0.5, 1.0, n)  # (1 - x/n)为了方便显示
y2 = (1 - x/n) * np.random.uniform(0.5, 1.0, n)
z = (1 - x/2 + x**5 + y**3) * \
    np.exp(-x**2 - y**2)
# 换行做运算需要用\隔开,exp是底数为x指数是-x**2 - y**2

# 图像属性
mp.figure("3D Surface")

# 创建3D坐标轴
ax = mp.gca(projection='3d')

mp.title("3D Surface", fontsize=20)  # 图像标题

# X、Y、Z坐标轴文本
ax.set_xlabel('X', fontsize=14)
ax.set_ylabel('Y', fontsize=14)
ax.set_zlabel('Z', fontsize=14)

mp.tick_params(labelsize=10)  # 刻度标签大小

# 绘制三维线框图像:行距列距越小,画的图越密集
ax.plot_surface(x, y, z, rstride=10, cstride=10, cmap='jet')


mp.show()
  • 测试效果:
    荐
                                                        Python之数据分析(三维立体图像、极坐标系、半对数坐标)

3、三维散点

  • 格式:ax.scatter(x, y, z, s=大小, c=颜色, marker=点型)
  • 测试代码:
import numpy as np
import matplotlib.pylab as mp
from mpl_toolkits.mplot3d import axes3d

# 获得1000个使用随机作为服从正态分布的数据样本(数组)
n = 1000
x = np.random.normal(0, 1, n)  # 一参为标准差,二参为分布平坦性(越大越分散,越小越集中),三参为点的个数
y = np.random.normal(0, 1, n)
z = np.random.normal(0, 1, n)
d = np.sqrt(x ** 2 + y ** 2 + z ** 2)  # 根号下 x平方加y平方 作为点到正态中心的距离

# 绘制图像
mp.figure("Scatter 3D")
ax = mp.gca(projection='3d')
mp.title("Scatter 3D", fontsize=20)  # 图像标题

ax.set_xlabel('X', fontsize=14)  # X、Y刻度显示的文本
ax.set_ylabel('Y', fontsize=14)
ax.set_zlabel('Z', fontsize=14)

mp.tick_params(labelsize=10)  # 刻度标签大小

ax.scatter(x, y, z, s=60, c=d, cmap="jet_r", alpha=0.5, marker='*')  # marker常用D,*,s,默认圆点o

mp.show()
  • 测试效果:
    荐
                                                        Python之数据分析(三维立体图像、极坐标系、半对数坐标)

二、极坐标系

1、格式
ax = mp.gca(projection=‘polar’)
mp.plot…
mp.scatter…
x、y分别对应极角、极径

2、测试代码

import numpy as np
import matplotlib.pylab as mp

t = np.linspace(0, 2 * np.pi, 1001)  # 极角
# 螺旋线
r_spiral = 0.8 * t  # 螺旋线,极径与极角是0.8倍的关系
# 玫瑰线
r_rose = 5 * np.sin(6 * t)

# 绘制图像
mp.figure("Polar", facecolor='lightgray')
ax = mp.gca(projection='polar')
mp.title("Polar", fontsize=20)  # 图像标题

# 坐标文本:极角,极径
ax.set_xlabel(r'$\theta$', fontsize=14)
ax.set_ylabel(r'$\rho$', fontsize=14)
mp.grid(linestyle=':')

# 螺旋线
mp.plot(t, r_spiral, c='dodgerblue', label=r'$\rho=0.8\theta$')
# 玫瑰线
mp.plot(t, r_rose, c='red', label=r'$\rho=5sin(6\theta)$')

mp.tick_params(labelsize=10)  # 刻度标签大小

mp.legend()
mp.show()

3、测试效果
荐
                                                        Python之数据分析(三维立体图像、极坐标系、半对数坐标)

三、半对数坐标

1、格式
mp.semilogy(…参数与mp.plot一样)
mp.semilogx()

2、测试代码

import numpy as np
import matplotlib.pylab as mp

y = np.array([1, 10, 100, 1000, 100, 10, 1])  # y坐标序列


# 绘制图像
mp.figure("Normal & Log", facecolor='lightgray')

mp.subplot(2, 1, 1)  # 创建位置在2行1列的子图

# 普通plot
mp.title("Normal", fontsize=16)  # 图像标题
mp.ylabel('Y', fontsize=12)

# 刻度定位:x方向
ax = mp.gca()
ax.xaxis.set_major_locator(
    mp.MultipleLocator(1)  # 多点定位器主刻度
)
ax.xaxis.set_minor_locator(
    mp.MultipleLocator(0.1)  # 多点定位器次刻度
)
# y方向
ax.yaxis.set_major_locator(
    mp.MultipleLocator(250)  # 多点定位器主刻度
)
ax.yaxis.set_minor_locator(
    mp.MultipleLocator(50)  # 多点定位器次刻度
)

# 设置主刻度网格线
mp.grid(which='major', axis='both', linewidth=0.75, linestyle='-', color='lightgray')
# 设置次刻度网格线
mp.grid(which='minor', axis='both', linewidth=0.25, linestyle='-', color='lightgray')
mp.plot(y, 'o-', c='dodgerblue', label='plot')
mp.legend()

mp.subplot(2, 1, 2)  # 创建位置在2行1列的子图
# 对数plot坐标
mp.title("Log", fontsize=16)  # 图像标题
mp.xlabel('X', fontsize=12)
mp.ylabel('Y', fontsize=12)

# 刻度定位:x方向
ax = mp.gca()
ax.xaxis.set_major_locator(
    mp.MultipleLocator(1)  # 多点定位器主刻度
)
ax.xaxis.set_minor_locator(
    mp.MultipleLocator(0.1)  # 多点定位器次刻度
)
# y方向:按照缺省来自动设置

# 设置主刻度网格线
mp.grid(which='major', axis='both', linewidth=0.75, linestyle='-', color='lightgray')
# 设置次刻度网格线
mp.grid(which='minor', axis='both', linewidth=0.25, linestyle='-', color='lightgray')
mp.semilogy(y, 'o-', c='orangered', label='semilog')
mp.legend()

mp.tight_layout()
mp.show()

3、测试效果
荐
                                                        Python之数据分析(三维立体图像、极坐标系、半对数坐标)

本文地址:https://blog.csdn.net/Viewinfinitely/article/details/107284551