简体   繁体   English

在python matplotlib中绘制plot_surface顶部的单个3D点

[英]plotting single 3D point on top of plot_surface in python matplotlib

I have some code to plot 3D surfaces in Python using matplotlib: 我有一些代码使用matplotlib在Python中绘制3D表面:

import math 

import numpy as np
import matplotlib.pyplot as plt
from pylab import meshgrid,cm,imshow,contour,clabel,colorbar,axis
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import seaborn as sns
sns.set(style="white")


def surface_map(func, xmin=0, xmax=1, ymin=0, ymax=1, step_size=0.05, maxz=25000):
    X, Y = meshgrid(
        np.arange(xmin, xmax, step_size),
        np.arange(ymin, ymax, step_size))
    Z = np.zeros(X.shape)

    for i in range(X.shape[0]):
        for j in range(X.shape[1]):
            Z[i, j] = min(func(X[i, j], Y[i, j]), maxz)

    return X, Y, Z


def plot_surface(X, Y, Z, xlabel, ylabel, zlabel, title, point=None, size=25):
    fig = plt.figure()
    ax = fig.gca(projection='3d')

    surf = ax.plot_surface(X, Y, Z, 
        rstride=1, cstride=1, vmin=0, vmax=20*1000,
        cmap=cm.RdBu, linewidth=0, antialiased=True)

    ax.zaxis.set_major_locator(LinearLocator(10))
    ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))

    ax.set_xlabel(xlabel)
    ax.set_ylabel(ylabel)
    ax.set_zlabel(zlabel)
    ax.set_title(title)

    fig.colorbar(surf, shrink=0.5, aspect=5)
    if point:
        ax.hold(True)
        func, fpr, recall = point
        ax.scatter([fpr], [recall], [
            func(fpr, recall)
        ], s=size, c='b', marker='.', zorder=10)
    plt.show()

And then I call it like so: 然后我这样称呼它:

# create mesh 
R, FPR, FuncValue = surface_map(my_function, xmin=0, xmax=1, ymin=0, ymax=1, step_size=0.05, maxz=20*1000)

# plot it
plot_surface(R, FPR, FuncValue, 
        xlabel="Recall", 
        ylabel="FPR", 
        zlabel="Function Value", 
        title="Recall Settings Payout Function",
        point=(my_function, 0.5, 0.5))

I'm setting ax.scatter to use large marker sizes and a high zorder , but no point gets drawn on the surface when the plot gets rendered. 我正在设置ax.scatter以使用大标记尺寸和高zorder ,但在渲染图时,表面上不会绘制任何点。

What am I missing? 我错过了什么?

The point you are looking for is there, but hidden "inside" the surface. 您正在寻找的点是,但隐藏在表面内“。 This is a common problem in matplotlib. 这是matplotlib中的常见问题。

I see two options here: 我在这里看到两个选项:

  1. Make the surface plot semitransparent, ie use alpha=.8 or similar. 使表面图半透明,即使用alpha=.8或类似。
  2. Use plot instead of scatter . 使用plot而不是scatter

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM