【问题标题】:Can I make a 3D scatter plot with words instead of numbers?我可以用文字而不是数字制作 3D 散点图吗?
【发布时间】:2021-05-12 14:51:45
【问题描述】:

我正在为学校做一个项目,并希望在 3d 散点图中解释这些数据,但是当我运行此代码时,我不断收到“ValueError: could not convert string to float: 'Location'”:

import pandas as pd 
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

df = pd.read_csv('baseball2.csv')

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

x = ['Location']
y = ['Landing']
z = ['Speed']

ax.scatter(x, y, z)
ax.set_xlabel("Location")
ax.set_ylabel("Landing")
ax.set_zlabel("Speed")

plt.show()

这是不长的 CSV 文件:

Location, Landing, Speed,
1B, 3BF, 90,
1A, FLF, 93,
3B, 2B, 91,
2C, SRF, 92,
1C, P, 83,
2C, C, 85,
3A, FLF, 93,
2C, SRF, 84,
3A, SS, 93,
1C, CF, 92,
2B, FRF, 91,
3A, FLF, 90,
3A, FLF, 91,
1C, C, 91,
3A, C, 91,
2B, HR, 91,
2A, DRF, 92,
3B, SRF, 82,
1B, SCF, 82

【问题讨论】:

    标签: python pandas matplotlib scatter-plot valueerror


    【解决方案1】:

    您可以将其作为 3D 散点图并为分类变量使用伪数值,但生成的数字将很难阅读。我推荐这样的 3D 条形图:

    import matplotlib.pyplot as plt
    import pandas as pd
    
    fig = plt.figure(figsize=(10, 10))
    ax = fig.gca(fc='white', projection='3d')
    
    df = pd.read_csv('data_files/original_file.csv')
    xy_data = [i for i in range(len(df[' Landing']))]
    
    ax.bar3d(xy_data,xy_data, df[' Speed'],1,1, -df[' Speed'])
    ax.set_xticklabels(df["Location"])
    ax.set_yticklabels(df[" Landing"])
    
    ax.set_xlabel("Location")
    ax.set_ylabel("Landing")
    ax.set_zlabel("Speed")
    plt.show()
    

    最后一个细节。在您的 csv 文件中,标题行中的 Landing 和 Speed 之前有一个前导空格。调用数据框列时请记住该空格,如我的代码所示。

    附录 为了回应您的评论,这里是 3D 散点图的代码。两个图中的 xy_data 列表理解用于创建这些类型的图形所需的假数值,因为它们通常对连续变量进行操作。然后通过 set_xticklabels() 和 set_yticklabels() 将您的分类变量分配给这些数字占位符。

    import matplotlib.pyplot as plt
    import pandas as pd
    
    fig = plt.figure(figsize=(10, 10))
    ax = fig.gca(fc='white', projection='3d')
    
    df = pd.read_csv('data_files/original_file.csv')
    xy_data = [i for i in range(len(df[' Landing']))]
    
    ax.scatter3D(xy_data,xy_data, df[' Speed'], color = 'green')
    ax.set_xticklabels(df["Location"])
    ax.set_yticklabels(df[" Landing"])
    
    ax.set_xlabel("Location")
    ax.set_ylabel("Landing")
    ax.set_zlabel("Speed")
    plt.show()
    

    【讨论】:

    • 谢谢,但有一个问题,我不能指向图表上的位置,而我可以指向散点图。我对编码很陌生,但我将如何制作散点图?我计划使情节以最重复的值突出的方式着色。还有“xy_data = [i for i in range(len(df[' Landing']))]”这一行有什么作用?
    • 没问题。请参阅我修改后的答案,其中显示了 3D 散点图及其代码。我会让你决定哪个情节更易读。此外,以下是在 Stack Overflow 上接受答案的礼仪规则:stackoverflow.com/help/someone-answers
    【解决方案2】:

    散点图需要 (x, y) 坐标或其他数字位置信息。您的问题在术语上似乎是矛盾的,因为字符串不容易转换为距离。

    您必须为每个标签定义一些指标。你可以用一个简单的查找值字典来做到这一点。

    【讨论】:

      猜你喜欢
      • 2015-11-12
      • 1970-01-01
      • 2019-03-16
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      相关资源
      最近更新 更多