我有160个国家的数据和12年期间每个国家的人口密度。我想把它绘制成三维散射图,但是我得到了一个错误:
我创造了三份名单--“年份”、“国名”、“人口密度”,但似乎我做错了。这是数据集的一个示例:

这是我的密码:
g1 = population_density["year"]
g2 = population_density["country_name"]
g3 = population_density["population_density_(people per sq. km of land area)"]
data = (g1, g2, g3)
colors= list(np.random.choice(range(256), size=160))
groups = ("year", "population density per sq.km", "countries")
# Create plot
fig = plt.figure(figsize = (10,8))
#ax = Axes3D(fig)
ax = fig.add_subplot(111, projection='3d')
#ax = fig.gca(projection='3d')
for data, color, group in zip(data, colors, groups):
x, y, z = data
ax.scatter(x, y, z, alpha=0.8, c=color, edgecolors='none', s=30, label=group)
plt.title('Population Density Over The Years')
plt.legend(loc=2)
plt.show()最后,我想要这些年的散点图--这个3d图。请帮帮我!
发布于 2019-07-25 06:59:46
而不是ax.scatter(x, y, z, alpha=0.8, c=color, edgecolors='none', s=30, label=group),代之以ax.scatter(g1, g2, g3, alpha=0.8, c=color, edgecolors='none', s=30, label=group)
您应该用g1替换x,用g2替换y,用g3替换z。根据matplotlib散射三维中的文档,使用的参数可以是数组形式的。通过使用for循环,您将解压列表中的值。
(编辑)在查看数据集之后,在x和y轴上有分类值,但是3d中的散点图需要定义笛卡尔坐标。因此,您可以做的是设置xticks和yticks。
您可以通过以下代码来完成这一任务
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
g1 = population_density["year"]
g2 = population_density["country_name"]
g3 = population_density["population_density_(people per sq. km of land area)"]
data = (g1, g2, g3)
colors= list(np.random.choice(range(256), size=len(g1)))
ax.scatter(g1, range(len(g2)), g3, alpha=0.8, c=colors, edgecolors='none', s=30)
ax.set(xticks=range(len(g1)), xticklabels=g1,
yticks=range(len(g2)), yticklabels=g2,
zticks=range(len(g3)), zticklabels=g3)
ax.set_xlabel('year')
ax.set_ylabel('countries')
ax.set_zlabel('population density per sq.km')
plt.title('Population Density Over The Years')
plt.legend(loc=2)
plt.show()https://stackoverflow.com/questions/57195383
复制相似问题