前言

~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

如何美化 Matplotlib 3D坐标系的更多相关文章

  1. 【Unity】第5章 3D坐标系和天空盒

    分类:Unity.C#.VS2015 创建日期:2016-04-20 一.简介 这一张主要介绍3D坐标系的基础知识以及各种形状的天空盒. 二.示例 本章的示例都在ch05Demos工程下.

  2. 如何美化 Matplotlib 的工具栏和绘图风格

    前言 matplotlib 功能十分强大,就是工具栏丑了点.忍了一个学期之后,还是决定自己动手,魔改一波 matplotlib 的工具栏样式.同时给大家分享一下自己按照 MATLAB 写的 matpl ...

  3. matplotlib 3D数据-【老鱼学matplotlib】

    直接上代码: import numpy as np import matplotlib.pyplot as plt # 导入显示3D的库 from mpl_toolkits.mplot3d impor ...

  4. 【Unity】5.1 3D坐标系基础知识

    分类:Unity.C#.VS2015 创建日期:2016-04-20 一.简介 在虚拟的游戏世界中,与3D有关的数学知识决定了游戏引擎如何计算和模拟出开发者以及玩家看到的每一帧画面.学习或者回想一下基 ...

  5. deep_learning_Function_ Matplotlib 3D 绘图函数 plot_surface 的 rstride 和 cstride 参数

    今晚开始接触 Matplotlib 的 3D 绘图函数 plot_surface,真的非常强大,图片质量可以达到出版级别,而且 3D 图像可以旋转 ,可以从不同角度来看某个 3D 立体图,但是我发现各 ...

  6. 3D坐标系

    在3D渲染中,首先要确定的就是坐标系,坐标系根据实际情况,分为两种: 左手坐标系 右手坐标系 在3D空间中,这两个坐标系是没有办法重合到一起的: Unity使用的坐标系为左手坐标系. 在确定左手坐标系 ...

  7. 【3D研发笔记】之【数学相关】(一):坐标系

    现在开始学习3D基础相关的知识,本系列的数学相关笔记是基于阅读书籍<3D数学基础:图形与游戏开发>而来,实现代码使用AS3,项目地址是:https://github.com/hammerc ...

  8. 3D数学学习笔记——笛卡尔坐标系

    本系列文章由birdlove1987编写.转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/24601215 1.3D数学 ...

  9. 3D数学基础(一)Unity坐标系

    Unity引擎时非常成熟的,引擎内部运用了很多的数学知识,他对开发者来说是不可见的,而且他已经封装好的算法也不是很全面.此外,要是使用引擎封装好的算法也要明白其实现的原理. 写过一些代码,也参考了一些 ...

随机推荐

  1. 【LeetCode】673. Number of Longest Increasing Subsequence 解题报告(Python)

    [LeetCode]673. Number of Longest Increasing Subsequence 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https:/ ...

  2. 教学日志:javaSE-循环语句

    一.while循环和do...while循环 /* while循环:先判断条件,再执行逻辑代码 四部分组成: 1.初始化:循环的初始化变量 2.条件判断:条件返回必须是true或false 3.循环体 ...

  3. 【转】GitHub 的 Pull Request 和 GitLab 的 Merge Request 有区别吗?

    在 GitHub 上混久了,经常听到 Pull Request,在 GitLab 上混久了,则经常 提起 Merge Request ,然而它们之间有不同吗?为什么要用两个不同的名称? 要追溯这两个名 ...

  4. SOFA 数据透析

    数据透传: 在 RPC调用中,数据的传递,是通过接口方法参数来传递的,需要接口方定义好一些参数允许传递才可以,在一些场景下,我们希望,能够更通用的传递一些参数,比如一些标识性的信息.业务方可能希望,在 ...

  5. Java基础寒假作业-个人所得税计算系统

    <个人所得税计算系统>设计 一.需求说明 设计一个简易的个人所得税计算系统,通过输入个人应发工资计算出各个地区的三险(医疗保险.养老保险)一金(公积金)和个人所得税.系统需要实现用户登录. ...

  6. Java初学者作业——用户输入一个小数,程序分解出整数部分和小数部分。

    返回本章节 返回作业目录 需求说明: 用户输入一个小数,程序分解出整数部分和小数部分. 实现思路: 接收用户控制台输入的小数. 用强制类型转换将整数部分得到. 使用用户输入的小数减去整数部分得到小数部 ...

  7. Kafka集群安装Version2.10

    Kafka集群安装,基于版本2.10, 使用kafka_2.10-0.10.1.0.tgz安装包. 1.安装规划 Storm集群模式,安装到下面三台机器 IP Hostname 10.43.159.2 ...

  8. ubuntu18.04 安装谷歌chrome浏览器

    将下载源添加到系统源列表 # sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/source.li ...

  9. php反序列化之pop链构造

    本题是某信有一次内部比赛的题目,涉及到pop链的构造问题,所以在这里与大家分享一下 题目 查看源码 逻辑是当参数fn存在且不包含string.zlib.flag这三个字符串时,进行文件包含这里的过滤是 ...

  10. 拉普拉斯平滑(Laplacian smoothing)

    概念 零概率问题:在计算事件的概率时,如果某个事件在观察样本库(训练集)中没有出现过,会导致该事件的概率结果是  $0$ .这是不合理的,不能因为一个事件没有观察到,就被认为该事件一定不可能发生(即该 ...