matplotlib———柱状图

matplotlib—柱状图

柱状图的概念:

柱状图(bar chart),是一种以长方形的长度为变量来表达图形的统计报告的图,由一系列高度不等的纵向条纹表示数据分布的情况,用来比较两个或以上变量(不同时间或者不同条件)的关系。柱状图亦可横向排列,或用多维方式表达,应用于比较分类变量的数值,例如可以用于展示衣服裤子鞋子等商品的销售量。

柱状图的做法:

1.主要参数的介绍:

bar(left, height, width=0.8, bottom=None, **kwargs)

  • left : 和分类数量一致的数值序列,序列里的数值数量决定了柱子的个数,数值大小决定了距离0点的位置。
  • height : 分类变量的数值大小,决定了柱子的高度。
  • width : 决定了柱子的宽度,仅代表形状宽度而已。
  • bottom : 决定了柱子距离x轴的高度,默认为None,即表示与x轴距离为0。

示例代码:

@skl--python
data = pd.DataFrame({"label":["a","b","c","d","e"],"value":[30,20,15,25,10]})

x = data["label"]
y = data["value"]

fig,ax = plt.subplots(figsize=(8,5),dpi=80)

ax.bar(np.arange(len(x)),y,width=0.3,bottom=[5,0,0,8,0])           #left参数值:np.arange(len(x)),height参数值:y
plt.show()

运行结果:

这里写图片描述
这里写图片描述

为了更加清楚每个参数的调整与效果,这里都将仔细的对于每一步进行展示,以便于日后自己复习。
以下将bottom参数省略时,也就是默认值None(表示与x轴的距离为0),将width值调整大一点时,柱子宽度增加(下文展示)。

示例代码:

@skl--python

data = pd.DataFrame({"label":["a","b","c","d","e"],"value":[30,20,15,25,10]})
x = data["label"]
y = data["value"]
fig,ax = plt.subplots(figsize=(8,5),dpi=80)
ax.bar(np.arange(len(x)),y,width = 0.3)
plt.show()

运行结果:

这里写图片描述

2.添加x轴标签tick label:

同样的操作,只是多了tick_label参数,这里将参数tick_label赋值为x,因为x值是data的label值为(a,b,c,d,e)。

示例代码:

@skl--python

data = pd.DataFrame({"label":["a","b","c","d","e"],"value":[30,20,15,25,10]})
x = data["label"]
y = data["value"]
fig,ax = plt.subplots(figsize = (8,5),dpi = 80)
ax.bar(np.arange(len(x)),y,width = 0.5,tick_label = x)
plt.show()

运行结果:

这里写图片描述

3.添加数据标签:

如果你觉得柱子的高度不够明确的表达数值的大小,那么我们可以采用添加数据标签的办法。具体做法如下,ax.text()中的参数,需要解释一下,既然要添加数据标签,标签也就是一个文本,那么首先需要确定文本的位置(提到位置当然要确定x轴坐标和y轴坐标的值)。第一个参数:x轴坐标的位置,这里为a。第二个参数:y轴坐标的位置,这里为b+1。第三个参数:文本的内容,这里为b。参数ha:整个标签文本的位置,参数fontsize:标签文本中字体大小。

示例代码:

@skl--python

data = pd.DataFrame({"label":["a","b","c","d","e"],"value":[30,20,15,25,10]})
x = data["label"]
y = data["value"]
fig,ax = plt.subplots(figsize = (8,5),dpi = 80)
ax.bar(np.arange(len(x)),y,tick_label = x)
ax.set_ylim(0,35)  #设置y的坐标值范围
for a,b in zip(np.arange(len(x)),y):  #添加数据标签,把()里的打包起来
    ax.text(a,b+1,b,ha = "center",fontsize = 10)                   #a是np.arange(len(x))的值,b+1:y值+1,第三个参数是文本的内容对应y值,ha为标签的位置
plt.show()

运行结果:

这里写图片描述

把部分参数进行修改:

这里写图片描述

这里写图片描述

4.实例练习:
下面例子中用到了kaggle竞赛里一个案例的数据,Titanic罹难者救援的数据,首先还是将数据集进行读取进来,一样比步骤。

如下:

这里写图片描述

如果想知道在泰坦尼克号事故中不同等级舱位获救的人数,可以这样做。
示例代码:

@skl--python

x = np.unique(df["Pclass"])  #获取Pclass的唯一值(Pclass有几种取值)
y = df.groupby("Pclass")["Survived"].sum()  #下面进行讲解
fig,ax = plt.subplots(figsize = (7,5),dpi = 80)
ax.bar(np.arange(len(x)),y,width =0.4,tick_label = x)
ax.set_xlabel("Pclass")
ax.set_title("The number of rescued on Titanic")
ax.set_ylim(0,160)
for a,b in zip(np.arange(len(x)),y):
    ax.text(a,b+3,b,ha = "center",fontsize = 10)
plt.show()

运行结果:

这里写图片描述

补充知识:
关于以上代码中groupby的用法,Hadley Wickham 创造了一个用于表示分组运算的术语“split-apply-combine”(拆分-应用-合并),这个词很好的描述了整个过程。分组运算的第一个阶段,pandas对象(无论是Series、DataFrame还是其他的)中的数据会根据你所提供的一个或多个键被拆分(split)为多组。拆分操作是在对象的特定轴上执行的。例如,DataFrame可以在其行(axis = 0)或列(axis = 1)上进行分组。然后,将一个函数(如求和,求均值函数)应用到各个分组并产生一个新值。最后,所有这些函数的执行结果会被合并(Combine)到最终的结果对象上。下图大致说明了简单的分组聚合过程。

这里写图片描述

在本例中:

这里写图片描述

结论:
从以上柱状图中我们可以得到如下信息:1等舱的获救人数最多,3等舱次之,2等舱获救人数最少。
其实这个问题用pandas绘图来做更简单:

这里写图片描述

这里我们会发现pandas来作图,似乎更加简单一些。下面解释一下如何用pandas进行绘图。
示例:

这里写图片描述

如果想进一步了解不同等级舱位中男女的获救人数情况,用pandas绘图如下:
这里写图片描述
这里写图片描述

既然以上提到了两种作图,pandas很简洁但是定制能力不够,我们可以通过pandas 和matplotlib结合起来做更个性化的图。
示例代码:

@skl--python

fig,ax = plt.subplots(figsize = (8,5),dpi = 80) #matplotlib

df_ps = df.groupby(["Pclass","Sex"])["Survived"].sum()
#数据分类汇总

#用pandas 绘图画出分类汇总后的数据,并与ax对象关联起来
df_ps.plot(kind = "bar",rot = 0,figsize = (8,5),ax = ax,edgecolor = "w") 
#ax = ax,中左边为形参右边是实参(第一行创建的子图对象),
#把ax子图对象和pandas关联起来,

ax.set_title("The number of rescued on Titanic",fontsize = 14)  #ax设置的标题会直接关联到pandas做出的图里

#添加数据标签
for a,b in zip(np.arange(len(df_ps.values)),df_ps.values):
    ax.text(a,b+1,b,ha = "center")

#添加一条平均线,值为每种舱位每种性别的平均获救人数
avg = df["Survived"].sum()/6

#添加一条平行于x轴的水平线(垂直于y轴)
ax.axhline(y=avg,color =(210/255,199/255,180/255),linestyle = "--")  
ax.text(5,avg+5,"average is :"+str(int(avg))) #平行线的文本标签

#去除左右上的边框线,去除掉y轴刻度
ax.spines["left"].set_color("none")
ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")
ax.set_yticks([])  #去掉y轴刻度
plt.show()

运行结果:

这里写图片描述

5.其他柱状图类型

  • 堆积柱状图

示例代码:

@skl--python

plt.rcParams["font.sans-serif"] = ["SimHei"]                       #显示中文字体为SimHei,如不加可能会出现中文乱码

sale8 = [10,20,30,15,18]
sale9 = [10,12,24,32,8]
labels = ["{}号衣服".format(i) for i in range(1,6)]                 #将1到5的这些值传入到花括号里,这样可以生成1号衣服,2号衣服。。。

fig,ax = plt.subplots(figsize = (8,5),dpi = 80)
ax.bar(np.arange(len(sale8)),sale8,tick_label = labels,label = "8月")
ax.bar(np.arange(len(sale9)),sale9,bottom = sale8,tick_label = labels,label = "9月") #注意bottom值变化(bottom:距离x轴的高度)
ax.legend()
plt.show()

运行结果:

这里写图片描述

  • 并列柱状图

示例代码:

@skl--python

plt.rcParams["font.sans-serif"] = ["SimHei"]

sale8 = [5,20,15,25,10]
sale9 = [10,15,25,30,5]
labels = ["{}号衣服".format(i) for i in range(1,6)]

fig,ax = plt.subplots(figsize = (8,5), dpi = 80)
width_1 = 0.4

ax.bar(np.arange(len(sale8)),sale8,width = width_1,tick_label = labels,label = "8月")
ax.bar(np.arange(len(sale9))+width_1,sale9,width = width_1,tick_label = labels,label = "9月") #注意宽度的变化
ax.legend()
plt.show()

运行结果:

这里写图片描述

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值