Python数据分析实战—用matplotlib实现数据可视化(3)

Python数据科学 专栏收录该内容
18 篇文章 1 订阅

《Python数据分析实战》

1.条状图

另外一种常用的图表类型为条状图。它跟直方图很相似,只不过x轴表示不是数值而是类别。用matplotlib的bar()函数生成条状图很简单。

import matplotlib.pyplot as plt

index = [0,1,2,3,4]
values = [5,7,3,4,6]

plt.bar(index,values)

这里写图片描述

实际上,我们还可以借助很多其他步骤进一步改进条状图。每一种改进方法都是通过在bar()函数中添加特定的关键字参数来实现的。

例如,把包含标准差的列表传给yerr关键字参数,就能添加标准差。这个参数常跟error_kw参数一起使用,而后者又接收其他可用于显示误差线的关键字参数。常用的两个是eColor和capsize,eColor指定误差线的颜色,而capsize指定误差线两头横线的宽度。会有一个参数叫作alpha,它控制的是彩色条状图的透明度。alpha的取值范围为0-1,0表示对象完全透明,随着alpha值的增加,对象逐渐清晰起来,到1时,颜色显示全了。照例我建议你在图表中添加图例。请用label关键字参数,为图表中的序列指定名称。

#index = np.arange(5)
index = ['A','B','C','D','E']
values1 = [5,7,3,4,6]
plt.title('A Bar Chart')
std1 = [0.8,1,0.4,0.9,1.3]

plt.bar(index,values1,yerr=std1,error_kw={'ecolor':'0.1', 'capsize':6},alpha=1,label='First')
plt.show()

这里写图片描述

水平条状图:

前面讲的都是沿垂直方向排列的条状图,实际上会有水平方向的条状图。这种模式的条状图用barh()函数实现。

#index = np.arange(5)
index = ['A','B','C','D','E']
values1 = [5,7,3,4,6]
plt.title('A Bar Chart')
std1 = [0.8,1,0.4,0.9,1.3]

plt.barh(index,values1,xerr=std1,error_kw={'ecolor':'0.1', 'capsize':6},alpha=1,label='First')
plt.legend(loc=5)
plt.show()

这里写图片描述

多序列条状图:

多序列条状图就是多个长条共用相同的类别。

index = np.arange(5)
values1 = [5,7,3,4,6]
values2 = [6,6,4,5,7]
values3 = [5,6,5,4,6]
plt.axis = [0,5,0,8]
bw=0.3

plt.title("A Multiseries Bar Chart")

plt.bar(index,values1,bw,color='b')
plt.bar(index+bw,values1,bw,color='g')
plt.bar(index+2*bw,values1,bw,color='r')

plt.xticks(index+1*bw,['A','B','C','D','E'])

plt.show()

这里写图片描述

多序列水平条状图的生成方法也很简单,用barh(0函数替换bar()函数,同时要记得用ytciks()函数替换为xsticks()函数。此外,还需要加换axis()函数的参数中两条轴的取值范围。

index = np.arange(5)
values1 = [5,7,3,4,6]
values2 = [6,6,4,5,7]
values3 = [5,6,5,4,6]
plt.axis = [0,8,0,5]
bw=0.3

plt.title("A Multiseries Bar Chart")

plt.barh(index,values1,bw,color='b')
plt.barh(index+bw,values1,bw,color='g')
plt.barh(index+2*bw,values1,bw,color='r')

plt.yticks(index+1*bw,['A','B','C','D','E'])

plt.show()

这里写图片描述

为pandas DataFrame生成多序列条状图:

跟线性图那一节所讲的类似,matplotlib库还可以直接把存放数据分析结果的DataFrame对象做成条状图,甚至可以快速完成,实现自动化。

你唯一需要做的就是在DataFrame对象上调用plot()函数,指定kind关键字参数,把图表类型赋给它,这里使用bar类型。


df2 = pd.DataFrame({
    'co1':[1,2,3],
    'co2':[4,5,6]
}, index=['a','b','c'])

df.plot(kind='bar')
plot.show()

#或者通过下面方式生成DataFrame对象
data = {
    'series1':[1,3,4,3,5],
    'series2':[2,4,5,2,4],
    'series3':[3,2,3,1,3]
}
df = pd.Dataframe(data)
df.plot(kind='bar')
plt.show()

这里写图片描述

注意:
1.如果你想多图像生成过程拥有更多的控制器,或者需要对其进行改动,可以从DataFrame中抽取几部分数据,将其保存为Numpy数组,然后把它们作为一个个单独的参数传递给matplotlib函数。
2.此外,同样的规则也适用于制作水平条状图,但记得把barh赋给kind关键字参数。

多序列堆积条状图:

多序列条状图的另外一种表现形式是堆积条状图,几个条状图堆积在一起形成一个更大的长条。如果你想表示总和是由几个条状图相加得到的,堆积图就特别合适。

要把简单的多序列条状图转换为堆积图,需要每个bar()函数中添加bottom关键字参数,把每个序列赋给相应的bottom关键字参数。

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

series1 = np.array([3,4,5,2])
series2 = np.array([1,2,2,5])
series3 = np.array([2,3,3,4])

index = np.arange(4)
#plt.axis([0,4,0,15])

plt.bar(index,series1,color='r')
plt.bar(index,series2,color='b',bottom=series1)
plt.bar(index,series3,color='g',bottom=(series1+series2))

plt.xticks(index,['Jan15','Feb15','Mar15','Apr15'])

plt.show()

这里写图片描述

同时,要创建相应的水平堆积条状图,则需用barh()函数替换bar()函数,记得同时修改其他参数。xticks()函数必须替换为yticks()函数,因为类别标签现在必须置于y轴之上。

前面我们一直用不同的颜色来区别多个序列,其实还可以用不同的影线填充条状图,方法如下。首先把条状图颜色设置为白色,然后用hatch关键字参数来指定影线的类型。不同的影线使用不同的字符(|、/、-、\、*)表示,每种字符对应一种用来填充条状图的线性类型。同一符合出现的次数越多,则形成阴影的线条越密集,例如,///比//密集,而//又比/密集。

plt.barh(index,series1,color='w',hatch='xx')
plt.barh(index,series2,color='w',hatch='///',left=series1)
plt.barh(index,series3,color='w',hatch='\\\\',left=(series1+series2))

为pandas DataFrame绘制堆积条状图:

同时,用plot()函数直接把DataFrame对象中的数据制作成堆积条状图也很简单。只需把stacked关键字次数置为True。

data = {
    'series1':[1,3,4,3,5],
    'series2':[2,4,5,2,4],
    'series3':[3,2,3,1,3]
}
df = pd.Dataframe(data)

df.plot(kind='bar',stacked=True)

plt.show()

其他条状图:

另外一种非常有用的图形表示法是用条状图表示对比关系。两列有着共同类别的数据,其条状图图形分列于x轴两侧,沿y轴方向生长。

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

x0 = np.arange(8)
y1 = np.array([1,3,4,6,4,3,2,1])
y2 = np.array([1,2,5,4,3,3,2,1])
plt.ylim(-7,7)
#0.9是指定长条的宽度
plt.bar(x0,y1,0.9,facecolor='r',edgecolor='g')
plt.bar(x0,-y2,0.9,facecolor='b',edgecolor='g')

#没有下面一行,会显示纵行的网格线
plt.xticks(())
plt.grid(True)

#在长条的末端显示y值标签
for x,y in zip(x0,y1):
    plt.text(x+0.05,y+0.05,'%d' % y,ha='center',va='bottom')
for x,y in zip(x0,y2):
    plt.text(x+0.05,-y-0.05,'%d' % y,ha='center',va='top' )

plt.show()

这里写图片描述

2.饼图

除了条状图,饼图也可以用来表示数据。用pie()函数制作饼图很简单。

该函数仍然以要表示的一列数据作为主要参数。

#饼图

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

labels = ['Nokia','Samsung','Apple','Lumia']
values = [10,30,45,15]
colors = ['yellow','green','red','blue']
explode = [0.3,0,0,0]

#设置的角度是逆时针旋转
#autopct是指定显示百分比,shadow是指定添加阴影效果。
plt.pie(values,labels=labels,colors=colors,explode=explode,shadow=True,autopct='%1.1f%%',startangle=90)
#设置x,y轴刻度一致,这样饼图才能是圆的
plt.axis('equal')

plt.show()

这里写图片描述

为DataFrame绘制饼图:

我们也可以用饼图表示DataFrame对象中的数据。但是,每幅饼图只能表示一个序列,因此在下面这个例子中,我们只将序列df[‘series1’]作成图。我们需要使用plot()的kind关键字参数指定图表类型为pie。此外,要绘制一个标准的圆形饼图,就有必要添加figsize关键字参数。

import matplotlib.pyplot as plt
import pandas as pd

#字典形式
data = {
    'series1':[1,3,4,3,5],
    'series2':[2,4,5,2,4],
    'series3':[3,2,3,1,3]
}

#通过字典生成DataFrame数据结构对象
df = pd.DataFrame(data)

#获取df中的series1
df['series1'].plot(kind='pie',autopct='%1.1f%%',figsize=(6,6))

plt.show()

这里写图片描述

展开阅读全文
  • 0
    点赞
  • 0
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值