Добавьте изображение за пределами осей моего графика matplotlib - PullRequest
0 голосов
/ 14 июля 2020

Я впервые делал 3D-графики, используя matplot lib.

Я создал этот график:

enter image description here

Using this code:

fig = plt.figure(figsize=(10, 10))
ax = plt.axes(projection="3d")

idx = 14

#origin

ax.scatter([0],[0],[0],s=200,marker='+',color='k')

#object1

ax.scatter(object1_z[idx],object1_ra[idx],object1_dec[idx], s=100, color='r',marker='o')

#cross1

ax.scatter(cross1_position[2],cross1_position[0],cross1_position[1], s=400, color='b',marker='X')

#b_hat

ax.quiver(cross1_position[2],cross1_position[0],cross1_position[1],b_hat_z[idx],b_hat_ra[idx],b_hat_dec[idx],arrow_length_ratio=0.1,lw=2,color='b')

#k_hat

ax.quiver(object1_z[idx],object1_ra[idx],object1_dec[idx],1,0,0,arrow_length_ratio=0.1,lw=2,color='b')

#axis

ax.quiver(cross1_position[2]+(0.05*(cross1_position[2]-axis[2])),cross1_position[0]+(0.05*(cross1_position[0]-axis[0])),cross1_position[1]+(0.05*(cross1_position[1]-axis[1])),axis[2],axis[0],axis[1],arrow_length_ratio=0.1,color='r',pivot='tip')
ax.quiver(cross1_position[2]-(0.05*(cross1_position[2]-axis[2])),cross1_position[0]-(0.05*(cross1_position[0]-axis[0])),cross1_position[1]-(0.05*(cross1_position[1]-axis[1])),-axis[2],-axis[0],-axis[1],arrow_length_ratio=0.1,color='r',pivot='tip')

#joining lines

ax.plot([cross1_position[2],object1_z[idx]],[cross1_position[0],object1_ra[idx]],[cross1_position[1],object1_dec[idx]],linestyle='--',color='k',lw=2)
ax.plot([cross1_position[2],53],[cross1_position[0],0],[cross1_position[1],0],linestyle='--',color='k',lw=2)
ax.plot([object1_z[idx],53],[object1_ra[idx],0],[object1_dec[idx],0],linestyle='--',color='k',lw=2)

# sphere

u = np.linspace(0, 2*np.pi, 100)
v = np.linspace(0, np.pi, 100)

x = np.outer(np.cos(u),np.sin(v))
y = np.outer(np.sin(u),np.sin(v))
z = np.outer(np.ones(np.size(u)),np.cos(v))
ax.plot_surface(x,y,z,rstride=4,cstride=4, color='r',alpha=0.1,facecolors=plt.cm.gray(z))



ax.set_xlabel('z')
ax.set_ylabel('x')
ax.set_zlabel('y')

ax.set_xlim(-1.3,1.3)
ax.set_ylim(-1.3,1.3)
ax.set_zlim(-1.3,1.3)

plt.show()

I would like to put another sphere in this following position, off of the first set of axes:

введите описание изображения здесь

Мой вопрос:

Могу ли я сделать это, используя мои существующие оси? Если я попытаюсь поместить свою вторую сферу там, где я хочу, используя координаты (что-то вроде (x = 0, y = 0, z = 5)), это не даст мне того, что я хочу, потому что он раздавит мое существующее изображение. (по оси z).

Нужно ли мне добавить второй набор невидимых осей или что-то в этом роде?

В итоге: какой хороший способ разместить изображение на месте "ЗДЕСЬ" на изображении выше.

1 Ответ

1 голос
/ 14 июля 2020

Я провел много исследований, но не смог найти способ добавить изображение, используя только трехмерный график. Поэтому я использовал subplots, который представляет собой график 3D + 2D, основанный на официальной ссылке. К сожалению, правая часть графика находится в центре трехмерного графика и не может быть перемещена. Это не тот ответ, который вы ищете, но он может оказаться полезным.

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as patches
import matplotlib.cbook as cbook

fig = plt.figure(figsize=(18,9))


test_img = '/Users/youraccount/Documents/Python/stackoverflow/logo-the-overflow.png'
with cbook.get_sample_data(test_img) as image_file:
    image = plt.imread(image_file)

# Make data
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))

ax = fig.add_subplot(121, projection='3d')
# Plot the surface
ax.plot_surface(x, y, z)

# Placement 0, 0 would be the bottom left, 1, 1 would be the top right.
ax.text2D(1.5, 0.3, "2D Text", transform=ax.transAxes, fontsize=24)

ax = fig.add_subplot(122)
im = ax.imshow(image)
patch = patches.Rectangle(xy=(1.0, -0.5), width=708, height=144, transform=ax.transData)
im.set_clip_path(patch)
ax.axis('off')

plt.show()

введите описание изображения здесь

...