python绘制三维图,怎么把这个美女图嵌套在柱状图颜色里面?

img


我是说  数据图填充美女图片
将一张图片裁剪
数据图中的颜色不在是
红黄蓝绿黑 单调一种颜色

而是图片的图层裁剪,正好是里面的填充图片
# 3d柱状图那就太棒了
import os
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import time

def create_folder_if_not_exists(folder_path):
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)

# 输入路径的图片文件路径(美女图)
image_path = input("请输入美女图片文件路径:")

# 创建文件夹
save_folder = "/storage/emulated/0/文件/代码print相关/结构图/"
create_folder_if_not_exists(save_folder)

# 生成数据
data = np.random.randint(1, 10, size=(10, 10))  # 生成示例数据,请根据需要替换为你的数据

# 创建绘图对象
fig = plt.figure(figsize=(8, 6), dpi=100)
ax = fig.add_subplot(111, projection='3d')

# 绘制3D柱状图
x_pos, y_pos = np.meshgrid(np.arange(data.shape[0]), np.arange(data.shape[1]), indexing="ij")
x_pos = x_pos.flatten()
y_pos = y_pos.flatten()
z_pos = np.zeros_like(x_pos)
dx = dy = 0.8
dz = data.flatten()

# 使用输入的数据图片作为纹理
img = Image.open(image_path).convert("RGBA")

# 将图像调整为适合柱子的大小
img = img.resize((int(dx * data.shape[0]), int(dy * data.shape[1])), Image.LANCZOS)

# 将图像转换为numpy数组
img_data = np.array(img)

# 在每个柱子内填充图像的一部分
for i in range(len(x_pos)):
    xpos, ypos, zpos = x_pos[i], y_pos[i], z_pos[i]
    
    # 裁剪图像的一部分以填充柱子
    x_start = int(xpos * dx)
    x_end = x_start + int(dx)
    y_start = int(ypos * dy)
    y_end = y_start + int(dy)
    color = img_data[y_start:y_end, x_start:x_end, :3]  # 取图像的RGB颜色
    
    ax.bar3d(xpos, ypos, zpos, dx, dy, dz[i], shade=True, color=color)

# 生成文件名
base_name = os.path.basename(image_path)  # 获取图片文件名
name_without_extension = os.path.splitext(base_name)[0]  # 去除扩展名
timestamp = int(time.time())
filename = f"编号.{name_without_extension}.{timestamp}.png"

# 保存结果图像
result_path = os.path.join(save_folder, filename)
plt.savefig(result_path)

print("结果图像已保存至:", result_path)

【以下回答由 GPT 生成】

优化后的问题:

问题标题: Python如何在绘制的三维柱状图中嵌入一张图片作为颜色?

问题内容: 我想绘制一个三维柱状图,并将一张图片嵌入到柱状图的颜色中。具体来说,我想使用一张美女图片来填充柱状图的每个柱子,而不是使用单一颜色(如红、黄、蓝等)。我希望最终的效果是每个柱子的颜色都是裁剪后的美女图片的一部分。

# 导入所需的库
import os
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import time

# 创建文件夹的函数
def create_folder_if_not_exists(folder_path):
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)

# 输入美女图片的路径
image_path = input("请输入美女图片文件路径:")

# 创建保存图片的文件夹
save_folder = "/storage/emulated/0/文件/代码print相关/结构图/"
create_folder_if_not_exists(save_folder)

# 生成示例数据
data = np.random.randint(1, 10, size=(10, 10))

# 创建绘图对象
fig = plt.figure(figsize=(8, 6), dpi=100)
ax = fig.add_subplot(111, projection='3d')

# 绘制3D柱状图
x_pos, y_pos = np.meshgrid(np.arange(data.shape[0]), np.arange(data.shape[1]), indexing='ij')
x_pos = x_pos.flatten()
y_pos = y_pos.flatten()
z_pos = np.zeros_like(x_pos)
dx = dy = 0.8
dz = data.flatten()

# 使用输入路径的图片作为纹理
img = Image.open(image_path).convert("RGBA")

# 调整图片大小以适应柱子
img = img.resize((int(dx * data.shape[0]), int(dy * data.shape[1])), Image.LANCZOS)

# 将图片转换为数组
img_data = np.array(img)

# 在每个柱子内填充部分图片
for i in range(len(x_pos)):
    xpos, ypos, zpos = x_pos[i], y_pos[i], z_pos[i]

    # 裁剪图片以填充柱子
    x_start = int(xpos * dx)
    x_end = x_start + int(dx)
    y_start = int(ypos * dy)
    y_end = y_start + int(dy)
    color = img_data[y_start:y_end, x_start:x_end, :3]  # 获取图片的RGB颜色

    ax.bar3d(xpos, ypos, zpos, dx, dy, dz[i], shade=True, color=color)

# 保存图像
timestamp = int(time.time())
save_path = os.path.join(save_folder, f"image_{timestamp}.png")
plt.savefig(save_path)

# 显示图像
plt.show()

请按照上述代码中的注释进行操作,其中 image_path 为你想要嵌入的图片的路径,save_folder 为保存图片的文件夹路径。最后,将生成的图片保存并显示出来。

希望这些信息对你有所帮助!如有任何问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^