我有一个如下所示的数据框: Dataframe Snapshot
我想在图表上制作一个只有点的散点图,我希望所有的点都在图表上的列中排列,其中每列在 y 轴上代表一个月(一月、二月、三月等) .实际数据点将绘制在 y 轴上。
当我这样做
df.plot.scatter()
它当然要我声明一个 x 和 y 值。如果您查看我附上的数据框图片,我真的无法做到这一点。如何绘制每个月的所有点在每个月标签上方的 x 轴上垂直排列的位置?我也试过:
df.plot.box
这基本上给了我想要的东西,但我只想要点,而不是它也试图绘制的框/ mustache 。我只想要积分。
最佳答案
我认为您无法使用 pandas 绘制带有分类变量的散点图。您可以为要绘制的每个月分配一个数值,尽管您也可以只使用 matplotlib
创建测试数据集:
data = np.random.randn(4, 3)
df = pd.DataFrame(data, columns=['Jan', 'Feb', 'Mar'])
将其转换为长格式:
df = df.melt()
绘制时需要指定每个类别的 x 位置。我使用枚举,尽管您也可以创建一个包含数值的新列
groups = df.groupby('variable')
fig, ax = plt.subplots()
x_ticks = []
x_ticklabels = []
for i, (name, group) in enumerate(groups):
y = group.value
x = [i]*len(y)
ax.scatter(x, y)
x_ticks.append(i)
x_ticklabels.append(name)
然后您可以设置您的刻度标签以匹配您的 x 值:
ax.set_xticks(x_ticks)
ax.set_xticklabels(x_ticklabels);
更新 我喜欢以长格式处理事情,因为每个条目都变成一个单独的观察结果,但是我意识到在不转换数据的情况下遍历列会更简洁:
fig, ax = plt.subplots()
for i, (name, value) in enumerate(df.iteritems()):
ax.scatter([i]*len(value), value)
ax.set_xticks(range(len(df.columns)))
ax.set_xticklabels(df.columns);
关于来自具有多列的 Pandas 数据框的 Python 散点图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47186724/