ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何美化 Matplotlib 3D坐标系

2021-04-11 09:34:01  阅读:245  来源: 互联网

标签:plt 1.0 color factor Matplotlib rcParams ax 坐标系 3D


前言

~mpl_toolkits.mplot3d 生成的3D坐标系背景色是灰色的,刻度线也向内延伸了,如果搭配上其他白色背景的 2D 图,看起来很奇怪,比如下面这张图:

未美化

网上有一些办法可以将3D坐标区的背景设置为白色,比如:

ax.w_xaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))
ax.w_yaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))
ax.w_zaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))

使用这段代码可以改变背景色,但是解决不了刻度线向内延伸的问题,有没有什么办法可以一劳永逸的解决这两个问题呢?

修改背景色

~mpl_toolkits.mplot3d.axis3d.Axis 的类属性定义处,有:

_AXINFO = {
        'x': {
            'i': 0,
            'tickdir': 1,
            'juggled': (1, 0, 2),
            'color': (0.95, 0.95, 0.95, 0.5),
        },
        'y': {
            'i': 1,
            'tickdir': 0,
            'juggled': (0, 1, 2),
            'color': (0.90, 0.90, 0.90, 0.5),
        },
        'z': {
            'i': 2,
            'tickdir': 0,
            'juggled': (0, 2, 1),
            'color': (0.925, 0.925, 0.925, 0.5),
        },
    }

很容易看出 color 的值控制着3个平面的背景色,把 3 个 color 的值全部改为 (1, 1, 1, 1) ,背景色就全部变成白色的了。

修改刻度线

~mpl_toolkits.mplot3d.axis3d.Axis 的构造函数中,有:

self._axinfo.update({
                'label': {
                    'va': 'center',
                    'ha': 'center'
                },
                'tick': {
                    'inward_factor': 0.2,
                    'outward_factor': 0.1,
                    'linewidth': {
                        True: (  # major
                            rcParams['xtick.major.width'] if adir in 'xz' else
                            rcParams['ytick.major.width']),
                        False: (  # minor
                            rcParams['xtick.minor.width'] if adir in 'xz' else
                            rcParams['ytick.minor.width']),
                    }
                },
                'axisline': {
                    'linewidth': rcParams['axes.linewidth'],
                    'color': rcParams['axes.edgecolor'],
                },
                'grid': {
                    'color': rcParams['grid.color'],
                    'linewidth': rcParams['grid.linewidth'],
                    'linestyle': rcParams['grid.linestyle'],
                },
            })

测试一波后,发现 inward_factor 控制刻度线向延伸部分的长度,outward_factor 控制向延伸部分的长度,把 inward_factor 的值改为 0.3 ,outward_factor 的值改为0,就再也见不到烦人的内刻度线了( ̄︶ ̄)↗ 。

测试

# coding:utf-8
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from matplotlib.gridspec import GridSpec
from sklearn.datasets import make_s_curve
from sklearn.manifold import MDS, LocallyLinearEmbedding, Isomap

plt.style.use(['matlab'])

# 创建数据
X, c = make_s_curve(1000, random_state=0)

# 数据降维
X_mds = MDS().fit_transform(X)
X_pca = PCA(2).fit_transform(X)
X_iso = Isomap(n_neighbors=10).fit_transform(X)
X_lle = LocallyLinearEmbedding(n_neighbors=10).fit_transform(X)
Xs = [X_pca, X_iso, X_lle, X_mds]
titles = [
    'Principal Components Analysis', 'Isometric Mapping',
    'Locally Linear Embedding', 'Multiple Dimensional Scaling'
]

# 绘制图像
fig = plt.figure('S型数据集上的流形学习', tight_layout=True)
gs = GridSpec(2, 3)
ax = fig.add_subplot(gs[:, 0], projection='3d')
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=c, cmap=plt.cm.Spectral)
ax.set(title='S curve', xlabel='x', ylabel='y', zlabel='z')
ax.view_init(14, -64)

for i, (x, title) in enumerate(zip(Xs, titles)):
    ax = fig.add_subplot(gs[i // 2, i + 1 - 2 * (i // 2)])
    ax.scatter(x[:, 0], x[:, 1], c=c, cmap=plt.cm.Spectral)
    ax.set_title(title)

plt.show()

代码 plt.style.use(['matlab']) 中用到的 mplstyle 文件见《如何美化 Matplotlib 的工具栏和绘图风格》,运行得到的图像如下:

美化后

至此美化大功告成,喜欢的话就点个赞吧 o( ̄▽ ̄)d

标签:plt,1.0,color,factor,Matplotlib,rcParams,ax,坐标系,3D
来源: https://www.cnblogs.com/zhiyiYo/p/14642975.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有