前言

~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]621. Task Scheduler 任务安排 题解

    题目描述 给定一个char数组,代表CPU需要做的任务,包含A-Z,不用考虑顺序,每个任务能在1个单位完成.但是有规定一个非负整数n代表两个相同任务之间需要至少n个时间单位.球最少数量的时间单位完成所 ...

  2. Shortest Path(hdu5636)

    Shortest Path  Accepts: 40  Submissions: 610  Time Limit: 4000/2000 MS (Java/Others)  Memory Limit: ...

  3. P1753HackSon的趣味题

    1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<stdli ...

  4. hbase构建二级索引解决方案

    关注公众号:大数据技术派,回复"资料",领取1024G资料. 1 为什么需要二级索引 HBase的一级索引就是rowkey,我们仅仅能通过rowkey进行检索.假设我们相对Hbas ...

  5. Chapter 12 IP Weighting and Marginal Structural Model

    目录 12.1 The causal question 12.2 Estimating IP weights via modeling 12.3 Stabilized IP weights 12.4 ...

  6. BUUCTF [极客大挑战 2019]Not Bad

    总的来说这是一个64位orw的题 开头先在主函数里分配了一个很大的空间 1 __int64 __fastcall main(int a1, char **a2, char **a3) 2 { 3 mm ...

  7. <数据结构>拓扑排序

    有向无环图 有向无环图(Directed Acycilc Graph, DAG):从任意顶点出发都无法回到自身的有向图. 拓扑排序 定义 任一两个顶点u,v间,如果存在边u->v,则排序后u一定 ...

  8. HAproxy开启日志记录

    1.说明 HAproxy在默认情况不会记录日志, 不仅要在haproxy.conf中配置日志输出, 还需要修改系统日志的配置文件. 2.修改haproxy.conf 在haproxy.conf文件中增 ...

  9. css基础-2 div布局

    div布局 <html> <head> <title>div布局 </title> <meta charset="utf-8" ...

  10. 【计项02组01号】Java版图形界面计算器

    Java版图形界面计算器1.0版本 项目分析[1.0] 组成部分 代码结构 (1)窗口的创建 在<JDK 核心 API>中我们提到,创建一个窗口需要使用 JFrame 类.在本实验中,我们 ...