[英]Can I make a 3D scatter plot with words instead of numbers?
我正在為學校做一個項目,並希望在 3d 散點圖中解釋這些數據,但是當我運行此代碼時,我不斷收到“ValueError:無法將字符串轉換為浮點數:'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
散點圖 plot 需要 (x, y) 坐標或其他數字位置信息。 您的問題在術語上似乎是矛盾的,因為字符串不容易轉換為距離。
您必須為每個 label 定義一些指標。 你可以用一個簡單的查找值字典來做到這一點。
您可以將其作為 3D 散布 plot 並為您的分類變量使用偽數值,但生成的數字將很難閱讀。 我推薦一個 3D 酒吧 plot 像這樣:
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 文件中,在 header 行中的 Landing and Speed 之前有一個前導空格。 當您調用 dataframe 列時,請記住該空格,如我的代碼所示。
附錄為了回應您的評論,這里是 3D 分散 plot 的代碼。 兩個圖中的 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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.