来自Pandas数据帧的Python散点图,其中有许多列

时间:2017-11-08 18:06:16

标签: python pandas dataframe scatter-plot scatter

我有一个如下所示的数据框: Dataframe Snapshot

我想在图表上用JUST POINTS制作一个散点图,我希望所有的点在图表上的列中排成一行,其中每列是y轴上的一个月(Jan,Feb,Mar等) 。实际数据点将绘制在y轴上。

当我这样做时

df.plot.scatter()

当然要我声明一个x和y值。如果你查看我附加的数据帧图片,我真的不能这样做。如何绘制每个月的所有点在每个月标签上方的x轴上垂直排列的位置?我也尝试过:

df.plot.box

这基本上给了我想要的东西,但我只想要点而不是盒子/胡须它也试图绘制。我只想要点数。

1 个答案:

答案 0 :(得分:1)

我不相信您可以使用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);

enter image description here

<强>更新 我喜欢以长篇形式处理事物,因为每个条目都成为单个观察,但我意识到在不转换数据的情况下循环遍历列会更简洁:

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);