[535]matplotlib(二)|python中用matplotlib绘制3D

  • 3D 散点图绘制(scatter)
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from matplotlib import pyplot as plt
 
# 生成3D示例数据
mu_vec1 = np.array([0,0,0]) # 均值向量
cov_mat1 = np.array([[1,0,0],[0,1,0],[0,0,1]]) # 协方差矩阵
 
class1_sample = np.random.multivariate_normal(mu_vec1, cov_mat1, 20)
class2_sample = np.random.multivariate_normal(mu_vec1 + 1, cov_mat1, 20)
class3_sample = np.random.multivariate_normal(mu_vec1 + 2, cov_mat1, 20)
 
# class1_sample.shape -> (20, 3), 20 rows, 3 columns
 
fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(111, projection='3d')
 
ax.scatter(class1_sample[:,0], class1_sample[:,1], class1_sample[:,2],
           marker='x', color='blue', s=40, label='class 1')
ax.scatter(class2_sample[:,0], class2_sample[:,1], class2_sample[:,2],
           marker='o', color='green', s=40, label='class 2')
ax.scatter(class3_sample[:,0], class3_sample[:,1], class3_sample[:,2],
           marker='^', color='red', s=40, label='class 3')
 
ax.set_xlabel('variable X')
ax.set_ylabel('variable Y')
ax.set_zlabel('variable Z')
 
plt.title('3D Scatter Plot')
 
plt.show()

image.png

  • 带特征向量的3D 散点图绘制 (scatter)
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.patches import FancyArrowPatch
from mpl_toolkits.mplot3d import proj3d
 
class Arrow3D(FancyArrowPatch):
    def __init__(self, xs, ys, zs, *args, **kwargs):
        FancyArrowPatch.__init__(self, (0,0), (0,0), *args, **kwargs)
        self._verts3d = xs, ys, zs
 
    def draw(self, renderer):
        xs3d, ys3d, zs3d = self._verts3d
        xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)
        self.set_positions((xs[0],ys[0]),(xs[1],ys[1]))
        FancyArrowPatch.draw(self, renderer)
 
 
# 生成示例数据
mu_vec1 = np.array([0,0,0])
cov_mat1 = np.array([[1,0,0],[0,1,0],[0,0,1]])
class1_sample = np.random.multivariate_normal(mu_vec1, cov_mat1, 20)
 
mu_vec2 = np.array([1,1,1])
cov_mat2 = np.array([[1,0,0],[0,1,0],[0,0,1]])
class2_sample = np.random.multivariate_normal(mu_vec2, cov_mat2, 20)
 
# 为PCA合并数据
samples = np.concatenate((class1_sample, class2_sample), axis=0)
 
# 求平均值
mean_x = np.mean(samples[:,0])
mean_y = np.mean(samples[:,1])
mean_z = np.mean(samples[:,2])
 
# 特征向量和特征值
eig_val, eig_vec = np.linalg.eig(cov_mat1)
 
################################
# 绘制特征向量
################################
 
fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(111, projection='3d')
 
ax.plot(samples[:,0], samples[:,1], samples[:,2], 'o', markersize=10, color='green', alpha=0.2)
ax.plot([mean_x], [mean_y], [mean_z], 'o', markersize=10, color='red', alpha=0.5)
for v in eig_vec.T:
    a = Arrow3D([mean_x, v[0]], [mean_y, v[1]],
                [mean_z, v[2]], mutation_scale=20, lw=3, arrowstyle="-|>", color="r")
    ax.add_artist(a)
ax.set_xlabel('variable X')
ax.set_ylabel('variable Y')
ax.set_zlabel('variable Z')
 
plt.title('3D scatter plot with eigenvectors')
 
plt.show()

image.png

  • 绘制3D立方体
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from itertools import product, combinations
fig = plt.figure(figsize=(7,7))
ax = fig.gca(projection='3d')
ax.set_aspect("equal")
 
# 画点
 
# 立方体里的点
X_inside = np.array([[0,0,0],[0.2,0.2,0.2],[0.1, -0.1, -0.3]])
 
X_outside = np.array([[-1.2,0.3,-0.3],[0.8,-0.82,-0.9],[1, 0.6, -0.7],
                      [0.8,0.7,0.2],[0.7,-0.8,-0.45],[-0.3, 0.6, 0.9],
                      [0.7,-0.6,-0.8]])
 
for row in X_inside:
    ax.scatter(row[0], row[1], row[2], color="r", s=50, marker='^')
 
for row in X_outside:
    ax.scatter(row[0], row[1], row[2], color="k", s=50)
 
# 画立方体
h = [-0.5, 0.5]
for s, e in combinations(np.array(list(product(h,h,h))), 2):
    if np.sum(np.abs(s-e)) == h[1]-h[0]:
        ax.plot3D(*zip(s,e), color="g")
 
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-1.5, 1.5)
ax.set_zlim(-1.5, 1.5)
 
plt.show()

image.png

  • 绘制有色表面的多变量高斯分布
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.mlab import bivariate_normal
from mpl_toolkits.mplot3d import Axes3D
 
fig = plt.figure(figsize=(10, 7))
ax = fig.gca(projection='3d')
x = np.linspace(-5, 5, 200)
y = x
X,Y = np.meshgrid(x, y)
Z = bivariate_normal(X, Y)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.cm.coolwarm,
        linewidth=0, antialiased=False)
 
ax.set_zlim(0, 0.2)
 
ax.zaxis.set_major_locator(plt.LinearLocator(10))
ax.zaxis.set_major_formatter(plt.FormatStrFormatter('%.02f'))
 
fig.colorbar(surf, shrink=0.5, aspect=7, cmap=plt.cm.coolwarm)
 
plt.show()

image.png

  • 绘制网格表面的多变量高斯分布
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.mlab import bivariate_normal
from mpl_toolkits.mplot3d import Axes3D
 
fig = plt.figure(figsize=(10, 7))
ax = fig.gca(projection='3d')
x = np.linspace(-5, 5, 200)
y = x
X,Y = np.meshgrid(x, y)
Z = bivariate_normal(X, Y)
surf = ax.plot_wireframe(X, Y, Z, rstride=4, cstride=4, color='g', alpha=0.7)
 
ax.set_zlim(0, 0.2)
 
ax.zaxis.set_major_locator(plt.LinearLocator(10))
ax.zaxis.set_major_formatter(plt.FormatStrFormatter('%.02f'))
 
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('p(x)')
 
plt.title('bivariate Gassian')
 
plt.show()

image.png

来源:http://blog.topspeedsnail.com/archives/716#more-716

要在Python中用matplotlib绘制折线图,且横坐标为中文,可以按照以下步骤操作: 1. 安装中文字体库 在Python绘制中文时,需要使用支持中文的字体库。可以从网上下载中文字体库,或者使用系统自带的中文字体库。例如,在Windows系统下,可以使用SimHei字体,而在Ubuntu系统下,可以使用WenQuanYi字体。 2. 导入matplotlib和中文支持库 在Python代码中,需要导入matplotlib库和支持中文的库,例如: ```python import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14) ``` 其中,FontProperties函数用于设置字体,fname参数用于指定字体文件的路径,size参数用于指定字体大小。 3. 绘制折线图 在绘制折线图时,需要设置中文标签和标题。例如: ```python plt.plot(x, y) plt.xlabel("日期", fontproperties=font) plt.ylabel("销售额(万元)", fontproperties=font) plt.title("2019年销售额走势图", fontproperties=font) plt.xticks(range(len(x)), x, fontproperties=font) plt.show() ``` 其中,xlabel()和ylabel()用于设置横纵坐标的标签,title()用于设置图表的标题,xticks()用于设置横坐标刻度的标签和位置。注意,xticks()中的第一个参数是刻度位置,第个参数是刻度标签,这里使用range(len(x))来指定刻度位置,x作为刻度标签。 完整代码如下: ```python import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14) x = ["一月", "月", "三月", "四月", "五月", "六月"] y = [20, 35, 40, 30, 25, 45] plt.plot(x, y) plt.xlabel("日期", fontproperties=font) plt.ylabel("销售额(万元)", fontproperties=font) plt.title("2019年销售额走势图", fontproperties=font) plt.xticks(range(len(x)), x, fontproperties=font) plt.show() ``` 运行代码后,就可以得到一个折线图,横坐标为中文标签。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值