Matplotlib:创建三维立方体图

dpiehjr4  于 2023-03-03  发布在  其他
关注(0)|答案(2)|浏览(238)

我正在尝试学习如何创建3D立方图来可视化数据。在这里,我将创建一些模拟数据来表示产品的销售情况。在x轴上,我将尝试绘制年份,在Y轴上,我将尝试绘制销售的产品,在Z轴上,我将尝试绘制这些产品的销售价格。以下是模拟数据集的一行的示例:

year    category    sales
2002    clothes     275

同样,x轴为年份,y轴为类别,z轴为销售额。
我目前拥有的是:

def plot_cube():
    x = []
    y = []
    z = []

    #creating data to plot. 300 total samples. x list will contain years (2001, 2002, and 2003
    for i in range(100):
        x.append(2001)
    for i in range(100):
        x.append(2002)
    for i in range(100):
        x.append(2003)

    # creating data to plot. 300 total samples. y list will contain items being sold (clothes, shoes, and hats)
    for i in range(100):
        y.append("clothes")
    for i in range(100):
        y.append("shoes")
    for i in range(100):
        y.append("hats")

    # creating data to plot. 300 samples. z list will contain how much in sales
    for i in range(300):
        z.append(random.randint(200, 300))

    arr = []

    for i in range(300):
        arr.append([x[i], y[i], z[i], 0])

    data = zip(*arr)

    fig = pyplot.figure()
    ax = fig.add_subplot(111, projection='3d')

    ax.scatter(data[0], data[1], data[2], c=data[3])
    pyplot.show()

    #returning x,y,z as lists
    return x, y, z

我从不同的论坛中找到了一些方法来组合这个函数,因为我看到很多人都在使用zip()函数,但是,这个函数目前对我来说不起作用,因为它返回了错误:

TypeError: 'zip' object is not subscriptable

我看到一些人通过将'data = zip(*arr)'更改为'data = list(zip(*arr))'来解决这个问题,但是当我这样做时,我得到了一个不同的错误:ValueError: could not convert string to float: 'clothes'
有什么想法吗?

p8h8hvxi

p8h8hvxi1#

如果你想把类别放在一个坐标轴上,它必须是一个数值--例如1、2、3 --而不是衣服、鞋子、帽子

smdnsysy

smdnsysy2#

ax.scatter()将X值、Y值和Z值的列表作为输入,因此不需要创建中间数组arrdata
然后,X、Y和Z需要是数值,因此将"clothes"、"shoes"和"hat"字符串值Map为数值(例如0、1、2),然后设置yticks值标签。
下面是一个工作示例:

import random
import matplotlib.pyplot as plt

x = [2001] * 100 + [2002] * 100 + [2003] * 100
    # clothes   # shoes     # hats
y = [0] * 100 + [1] * 100 + [2] * 100
z = [random.randint(200, 300) for i in range(300)]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.scatter(x, y, z, c=z)

ax.set_yticks([0, 1, 2], ["clothes", "shoes", "hats"])

相关问题