在matplotlib中针对数字变量绘制分类变量

时间:2017-11-13 17:01:58

标签: python pandas matplotlib

我的DataFrame结构

trx.columns
Index(['dest', 'orig', 'timestamp', 'transcode', 'amount'], dtype='object')

我试图针对transcode绘制amount(交易代码)以查看每笔交易花费了多少钱。我确保将transcode转换为分类类型,如下所示。

trx['transcode']
...
Name: transcode, Length: 21893, dtype: category
Categories (3, int64): [1, 17, 99]

我从plt.scatter(trx['transcode'], trx['amount'])做的结果是

Scatter plot

虽然上面的情节并非完全错误,但我希望X轴只包含transcode [1,17,99]的三个可能值,而不是整个[1,100]范围。< / p>

谢谢!

1 个答案:

答案 0 :(得分:2)

在matplotlib 2.1中,您可以使用字符串绘制分类变量。即如果您将x值的列提供为字符串,它会将它们识别为类别。

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

df = pd.DataFrame({"x" : np.random.choice([1,17,99], size=100),
                   "y" : np.random.rand(100)*100})

plt.scatter(df["x"].astype(str), df["y"])
plt.margins(x=0.5)
plt.show()

enter image description here

为了在matplotlib&lt; = 2.0中获得相同的效果,我们会反对某些索引。

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

df = pd.DataFrame({"x" : np.random.choice([1,17,99], size=100),
                   "y" : np.random.rand(100)*100})

u, inv = np.unique(df["x"], return_inverse=True) 
plt.scatter(inv, df["y"])
plt.xticks(range(len(u)),u)
plt.margins(x=0.5)
plt.show()

使用seaborn的stripplot

可以获得相同的情节
sns.stripplot(x="x", y="y", data=df) 

可以通过seaborn的swarmplot

进行更好的表示
sns.swarmplot(x="x", y="y", data=df)

enter image description here