【问题标题】:3d scatter plot without offset using matplotlib使用 matplotlib 无偏移的 3d 散点图
【发布时间】:2016-07-17 08:24:22
【问题描述】:

我正在尝试使用 matplotlib 和 python 构建一个 3d 散点图。 问题如下所示: 3d 图上点的偏移量使得无法理解这些点的确切位置。

这是构建的图表:

在此图中,请注意这些点与顶点并不完全重合。也就是说,根据图表,它显示在 0B 和 1B 和 4S 之间存在一个点,该点不包含在数据集中(参见下面的代码 MWE)。是否需要做一些事情来设置偏移量?

#!/usr/bin/env python
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from mpl_toolkits.mplot3d import Axes3D
import string
from matplotlib  import cm
import matplotlib

def plot_state_transition():
    xTickMarks = ["-1B","0B", "1B", "2B", "3B"]#, "4B"]#, "1B3S", "2B2S"]
    yTickMarks = ["-1S","0S", "1S", "2S", "3S", "4S"]
    zTickMarks = ["0", "0.6", "0.65", "0.9", "1.15"]
    matplotlib.rc('font', serif='Helvetica Neue')
    matplotlib.rc('text', usetex='false')
    matplotlib.rcParams.update({'font.size': 10})

    fig = plt.figure(figsize=(11.69,4.88)) # for landscape
    axes1 = fig.add_subplot(111, projection='3d')
    savename = "state-transition.png"

    tup = []
    plt.grid(True,linestyle='-',color='0.75')
    X_AXIS = ['2B', '2B', '1B', '2B', '2B', '2B', '1B', '2B']
    Y_AXIS = ['0S', '2S', '3S', '2S', '2S', '2S', '3S', '2S']
    Z_AXIS = ['0.6', '0.6', '0.6', '0.6', '0.6', '0.9', '0.9', '0.9']
    s  = [12.900648500000001, 12.705360163934426, 13.021028032786887, 13.258014354838707, 14.418979838709676, 17.092295806451613, 15.625246451612906, 17.484319354838711]

    x = [xTickMarks.index(i) for i in X_AXIS]
    y = [yTickMarks.index(i) for i in Y_AXIS]
    z = [zTickMarks.index(i) for i in Z_AXIS]
    s = s

    axes1.scatter(x, y, z, c='r', marker='o')

    axes1.set_xlim((0, len(xTickMarks)-1))
    axes1.set_ylim((0, len(yTickMarks)-1))
    axes1.set_zlim((0, len(zTickMarks)-1))

    axes1.set_xticks(xrange(len(xTickMarks)))
    axes1.set_yticks(xrange(len(yTickMarks)))
    axes1.set_zticks(xrange(len(zTickMarks)))

    axes1.set_xticklabels(xTickMarks)
    axes1.set_yticklabels(yTickMarks)
    axes1.set_zticklabels(zTickMarks)

    axes1.set_ylabel('Small cores')
    axes1.set_zlabel('Frequency')
    axes1.set_xlabel('Big cores')

    axes1.xaxis.grid(True)
    figsize=(11.69,8.27) # for landscape
    fig.savefig(savepath + savename, bbox_inches='tight', dpi=300, pad_inches=0.1)
    plt.clf()


def main():
    plot_state_transition()

if __name__ == "__main__":
    main()

【问题讨论】:

    标签: python matplotlib 3d


    【解决方案1】:

    我不认为情节有什么问题,只是它试图在二维上呈现 3 维信息。透视的尝试(这使它看起来像 3D)是导致偏移的原因。您可以消除任何偏移,最简单的方法是跳过 3D 效果,或者通过在绘图上设置“摄像机角度”来减少或消除偏移。您使用axes1.view_init(elev=x, azim=y) 设置摄像机角度。例如,使用您的数据,elev=10, azim=90 看起来像这样:

    elev=-5, azim=0 看起来像这样:

    您可以使用视图来查看是否有帮助。尽管这些改变了偏移量,但这些并不能完全消除问题,因为它是这些图的 3D 特性所固有的。

    【讨论】:

    • 这很有意义。我会尝试通过不同的视角运行,然后看看。谢谢。
    • 当我在做 3D 绘图时,我经常通过各种视图对绘图进行动画处理,例如从 -90 到 90 移动 2 o 步。这确实带来了“3D”,并大大减少了与透视相关的偏移问题。显然,如果您要在纸上发表,那就不好了,但是网络发布等可以很好地使用它,例如把它变成一个gif
    • 但是,你怎么把它变成一个gif?能举个例子吗?
    • 这里是one exampleanother
    • 嗨 iayork,您可能还想看看这个:stackoverflow.com/a/12905458/1059860 看起来很有趣,可以解决这个问题
    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多