使用Pandas数据框绘制Python散点图,该数据框包含许多列。

3
我有一个数据框,长这样:数据框快照 我想要制作一个散点图,只有点会显示,希望所有的点在图形中按列对齐,每一列都是一个月(Jan, Feb, Mar等)在y轴上。 实际的数据点将被绘制在y轴上。
当我执行以下操作时:
df.plot.scatter()

当然,IT要求我声明x和y值。如果您查看我附加的数据框图片,我实际上无法这样做。如何绘制每个月份的所有点在垂直于每个月份标签上的x轴上对齐的图形?我也尝试过以下方法:

df.plot.box

这基本上给了我想要的东西,但我只想要点,而不是它还试图绘制的框/箱形图。我只想要点。
1个回答

2
我不相信你能使用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);

这确实可以用来绘制数据,但是绘制出的数据似乎是错误的。我检查了表格以查看它绘制的数值,但我不知道它从哪里获取一些数值。例如,二月份最高的数据点应该是2.5,但有很多很多数据点超过了3。我查看了它所读取的数据,但没有反映出来。我不知道它正在绘制的数据来自哪里。 - JMP0629
我的数据框中有相当数量的“nan”。 当我将其转换为“long”,然后运行for语句,这会是问题所在吗? - JMP0629
请你提供一小部分数据样本,类似于我创建一个数据集并将其添加到您的问题中的方式。这样我们就知道我们正在使用相同的数据集。如果没有您数据的示例,就无法知道预期结果应该是什么。 - johnchase
我在我的原始问题中已经提供了答案。它链接在我的原始问题的第一句话中。 - JMP0629
你提到你的数据存在空值和大于3的值,但这些在屏幕截图中都没有出现,这表明你运行的数据不是你链接的数据。此外,通常不鼓励使用屏幕截图。如果你还没有,请查看MCVE。我的答案在我提供的数据上完美运行,所以你需要提供一个它无法正常工作的数据示例。 - johnchase
我也需要这个。只有一个问题,如何设置figsize? - Hristo Stoychev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接