之前介绍过matplotlib plot方法的详细用法,今天来介绍一下pandas中绘图方法,pandas中封装的绘图方法本质上还是调用了matplotlib的绘图方法。
- 基础绘图方法plot,pandas中Series和DataFrame的plot方法是包装自matplotlib的plot方法
# Series绘图
ts = pd.Series(
np.random.randn(1000),
index=pd.date_range('1/1/2000', periods=1000)
)
# cumsum累加求和,并保留累加的中间结果
ts = ts.cumsum(axis=0)
ts.plot()
- 对DataFrame调用plot函数,会将各个属性的名称设置为labels
df = pd.DataFrame(
np.random.randn(1000, 4),
index=ts.index,
columns=["A", "B", "C", "D"]
)
df = df.cumsum(axis=0)
df.plot()
- DataFrame调用plot函数时,可以通过指定x和y参数来绘制两个属性之间的关系
df3 = pd.DataFrame(
np.random.randn(100, 2),
columns=["B", "C"]
)
df3["A"] = pd.Series(list(range(len(df3))))
"""
参数解释:详见matplotlib plot函数参数解释
x:横轴数据
y:纵轴数据
color绘图颜色
linestyle:线条样式
linewidth:线条宽度
figsize:绘图大小
legend:是否显示图例
logy:是否对y轴数据进行log变化,控制数值范围
"""
df3.plot(x="A", y="B", color="b", linestyle="-", linewidth=2, figsize=(10,10), legend=True, logy=True)
绘制线形图以外的其他图像时,可以通过plot函数的kind参数控制图像样式:
- ‘bar’ or ‘barh’ for bar plots -> 条形图(竖直或水平)
- ‘hist’ for histogram -> 柱状图
- ‘box’ for boxplot -> 箱型图
- ‘kde’ or ‘density’ for density plots -> 密度图
- ‘area’ for area plots -> 面积图
- ‘scatter’ for scatter plots -> 散点图
- ‘hexbin’ for hexagonal bin plots -> 六角本图
- ‘pie’ for pie plots -> 饼图
1)、kind="bar"条形图(竖直)
df.iloc[5].plot(kind="bar")
print(df.iloc[5])
2)、kind="barh"条形图(水平)
df.iloc[5].plot(kind="barh")
print(df.iloc[5])
3)、除了使用plot的kind参数指定绘图样式,也可以直接使用plot.的形式指定绘图样式
# 绘制条形图
df.iloc[5].plot.bar()
- 绘制条形图DataFrame.plot.bar()
df.iloc[5].plot.bar()
plt.axhline(0, color='b');
df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df2.plot.bar()
# 将条形图进行堆叠
df2.plot.bar(stacked=True)
# 绘制水平条形图
df2.plot.barh(stacked=True)
- 绘制柱状图DataFrame.plot.hist()
df = pd.DataFrame(
{
"a": np.random.randn(1000) + 1,
"b": np.random.randn(1000),
"c": np.random.randn(1000) - 1
},
columns=["a", "b", "c"]
)
# alpha参数控制图像的透明度
df.plot.hist(alpha=0.5)
# 柱状图堆叠,并指定柱状图的分箱数
# bins参数控制统计区间的大小
df.plot.hist(stacked=True, bins=20)
# 也可以使用matplotlib库hist方法提供的关键字参数
df.plot.hist(orientation="horizontal", cumulative=True)
# 除了通过df.plot.hist方式进行调用,DataFrame也有hist方法
# DataFrame的hist方法使用多个子图分别绘制DataFrame的column
df.hist(bins=20)
s = pd.Series([1,3,4,6,7,9])
# diff函数用来判断属性的每个值与指定数值的差距,默认的指定数值为前一行的数值内容
s.diff().hist()
# DataFrame的hist方法可以使用by参数来定义分组
data = pd.Series(np.random.randn(1000))
# np.random.randint(0, 4, 1000)随机生成1000个0-3之间的数字,然后将这些数字进行分组,并将与之对应的data数据绘制直方图
data.hist(by=np.random.randint(0, 4, 1000), figsize=(6, 4))
pd.Series(np.random.randint(0, 4, 1000)).value_counts()
- 绘制箱型图DataFrame.plot.box()
箱型图简介:
(1)计算上四分位数(Q3),中位数,下四分位数(Q1)
(2)计算上四分位数和下四分位数之间的差值,即四分位数差(IQR,interquartile range)Q3-Q1
(3)绘制箱线图的上下范围,上限为上四分位数,下限为下四分位数。在箱子内部中位数的位置绘制横线。
(4)大于 上四分位数 1.5倍四分位数差 的值,或者小于下四分位数1.5倍四分位数差的值,划为异常值(outliers)。
(5)异常值之外,最靠近上边缘和下边缘的两个值处,画横线,作为箱线图的触须。
(6)极端异常值,即超出四分位数差3倍距离的异常值,用实心点表示;较为温和的异常值,即处于1.5倍-3倍四分位数差之间的异常值,用空心点表示。
(7)为箱线图添加名称,数轴等
df = pd.DataFrame(np.random.randn(10, 5), columns=["A", "B", "C", "D", "E"])
# 绘制所有数值属性的箱线图
df.plot.box()
# 绘制单独一个属性的箱线图
df["A"].plot.box()
df.boxplot()
# 设置箱线图的颜色
color = {'boxes': 'DarkGreen', 'whiskers': 'DarkOrange', 'medians': 'DarkBlue', 'caps': 'Gray'}
# sym指定异常值的样式
df.plot.box(color=color, sym='r+')
- 绘制面积图DataFrame.plot.area()
面积图的意义:堆积面积图是一种特殊的面积图,可以用来比较在一个区间内的多个变量。堆叠面积图和面积图的区别在于,堆叠面积图每个数据系列的起点都是基于前一个数据系列绘制的(堆叠面积图要求一列数据要么全为正,要么全为负),也就是每度量一行就要填满行与行之间的区域。如果有多个数据系列,并想分析每个类别的部分到整体的关系,并展现部分量对于总量的贡献时,使用堆积面积图是非常合适的选择。
df = pd.DataFrame(np.random.rand(10, 4), columns=["A", "B", "C", "D"])
df["B"] = df["B"] * -1.0
# 绘制的面积图默认是堆叠的形式,堆叠面积图要求同一个特征的数值要么全为正,要么全为负
df.plot.area()
df.loc[0].sum() - df.loc[0, "B"], df.loc[0, "B"], df.loc[9].sum() - df.loc[9, "B"], df.loc[9, "B"]
(1.2377821011551786, -0.3169154766752843, 1.9799948518694093, -0.7935035073522937)
df.loc[0:5, "B"] = df.loc[0:5, "B"] * -1.0
df.plot.area(stacked=False)
- 绘制散点图DataFrame.plot.scatter()
散点图要求属性是数值型的。
df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
df.plot.scatter(x="a", y="b")
# 在一个axes中绘制多个散点图
# 获取画布的句柄,指定绘制的颜色,标记样式
ax = df.plot.scatter(x="a", y="b", color="r", marker=".", figsize=(10, 8), s=50)
# 指定画布,颜色,标记样式,用来区分不同的数据
df.plot.scatter(x="c", y="d", ax=ax, color="b", marker="^")
df.plot.scatter(x="a", y="c", ax=ax, color="k", marker="<")
# 使用关键字c来为每个数据点设置不同的颜色,通常用来显示两个变量(x,y)的共同作用对第三个变量c的影响
df.plot.scatter(x='a', y='b', c='c', s=50)
- 不同绘图方法的缺失值处理方法
- 绘制散点图矩阵pandas.plotting.scatter_matrix
from pandas.plotting import scatter_matrix
# 使用scatter_matrix绘制所有特征组合之间的散点图,并指定对角线上的显示样式密度kde或柱状图hist
df = pd.DataFrame(np.random.randn(1000, 4), columns=['a', 'b', 'c', 'd'])
scatter_matrix(df, alpha=0.2, figsize=(8, 8), diagonal="hist")
- 绘制密度图DataFrame.plot.kde()
df.plot.kde(legend=True)
道阻且长,加油吧,少年!