我得到 barplot ,但没有得到 scatterplot

I am getting barplot , but not getting scatterplot

我在 python 2.7,使用 spyder IDE,这是我的数据:

          Duration      ptno
           7432.0  X35133502100
           7432.0  X35133502100
          35255.0   T7956000304
          35255.0   T7956000304
          17502.0   T7956000304
          17502.0   T7956000304
             46.0   T7956000304
             46.0   T7956000304

代码:

import time
import pandas as pd
import matplotlib.pyplot as plt

df1 = pd.read_csv('Nissin_11.09.2018.csv')

bx = df1.plot.bar(x='ptno', y='d', rot=0)

plt.setp(bx.get_xticklabels(),rotation=30,horizontalalignment='right')

plt.show()

对于列 Durationptno 中提到的每个值,我都得到了一个漂亮的条形图。作为参考,我附上了情节的图像文件。

但是当我尝试使用以下方法获得 scatter 绘图时:

df1.plot.scatter(x='ptno', y='d')

它抛出一个错误:

ValueError: scatter requires x column to be numeric

如何为我的数据绘制 'scatter' 图??

根据@Hristo Iliev 的建议,我使用了他的代码:

import seaborn as sns
_ = sns.stripplot(x='ptno', y='d', data=df1)

但它只在轴上绘制两个唯一值,我希望所有值都在 x 轴上,因为我的条形图具有 x 轴值。

您不能使用错误指示的非数字值制作散点图。在散点图中,每个点的位置由每个变量的值在实轴上的位置确定。 T7956000304 等分类值或字符串值没有直接映射到实轴上的位置。

虽然您可以绘制一系列带状图,每个带状图对应 ptno 的每个唯一值。使用 Seaborn 最容易做到这一点:

import seaborn as sns
_ = sns.stripplot(x='ptno', y='d', data=df1)

一种选择是使用纯 matplotlib。您需要创建一个数字数组以用作 x 轴,即 [1,2,3,4,5,...],然后将刻度标签更改为列 ptno 的值。

例如:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df1 = pd.DataFrame({"Duration":[7432,7432,35255,35255,17502,17502,46,46],
                    "ptno":["X35", "X35", "T79", "T79", "T79", "T79", "T79", "T79"]})

dummy_x = np.arange(len(df1.ptno))

plt.scatter(dummy_x, df1.Duration)
plt.xticks(dummy_x, df1.ptno)

plt.show()