我正在获取barplot,但未获取散点图

时间:2018-09-26 06:37:15

标签: python-2.7 pandas matplotlib bar-chart scatter-plot

我使用的是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列中提到的每个值,我都会得到一个漂亮的条形图。作为参考,我附上了情节的图像文件。

Bar plot of the dataframe

但是当我尝试通过以下方式获得scatter情节时:

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

它将引发错误:

ValueError: scatter requires x column to be numeric

如何为我的数据绘制一个“散点图”?

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

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

It only plot two unique values on axis

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

2 个答案:

答案 0 :(得分:2)

一种选择是使用纯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()

enter image description here

答案 1 :(得分:0)

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

您可以绘制的是一系列带状图,每个ptno的唯一值一个。这与Seaborn最简单:

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