前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >matplotlib相关图形绘制(一)

matplotlib相关图形绘制(一)

作者头像
朱小五
发布2020-03-05 11:50:31
9630
发布2020-03-05 11:50:31
举报
文章被收录于专栏:凹凸玩数据凹凸玩数据

大家好,我是黄同学

我们之前已经讲述了matplotlib的绘图原理,本文介绍相关图形绘制。

主要是箱线图、散点图、气泡图、雷达图。

《matplotlib绘图的核心原理》

《matplotlib绘图技巧详解(一)》

《matplotlib绘图技巧详解(二)》

《matplotlib绘图技巧详解(三)》

1、绘制X轴、Y轴平行线

1)作用

  绘制X轴、Y轴平行线,主要用来做对比参考。

2)语法格式与相关参数说明① 语法格式

  • 绘制X轴平行线
  • plt.axhline(y,xmin,xmax)
  • 绘制Y轴平行线
  • plt.axvline(x,ymin,ymax)

② 参数说明

3)演示说明

① 绘制X轴平行线

代码语言:javascript
复制
plt.subplot(121)
plt.axhline(0.5,0,1,c="r",lw=3)
plt.subplot(122)
plt.axhline(0.5,0.2,0.8,c="g",lw=3)

结果如下:

② 绘制Y轴平行线

代码语言:javascript
复制
plt.subplot(121)
plt.axvline(0.5,0,1,c="r",lw=3)
plt.subplot(122)
plt.axvline(0.5,0.2,0.8,c="g",lw=3)

结果如下:

2、绘制折线图

1)作用

  折线图用于显示随时间或有序类别而变化的趋势。折线图其实是由多个点连接在一起得到了,当点足够多的时候,折线图就变成了平滑的曲线。

2)语法格式和参数说明

① 语法格式

  • plot(y)
  • plot(y,‘格式’)
  • plot(x,y)
  • plot(x,y,‘格式’)
  • plot(x1,y1,‘格式1’,x2,y2,‘格式2’ …… xn,yn,“格式n”)

② 参数说明

3)演示说明

① 绘制一个点

代码语言:javascript
复制
plt.plot(50, marker="D")

结果如下:

② 绘制多个点

  当只传入一组数据的时候,那么每个元素的下标相当于X轴横坐标,这一组数据中的每个值相当于Y轴的纵坐标。当传入两组数据,第一组数据相当于X轴横坐标,第二组数据相当于Y轴的纵坐标。

代码语言:javascript
复制
plt.subplot(121)
plt.plot([8,2,9,15,-3],c="g",marker="v",ls="--")
plt.subplot(122)
plt.plot([-3,-1,5,8,12], [2,-10,9,3,6],c="r",marker="*",ls="-")

结果如下:

③ 绘制对比折线图

代码语言:javascript
复制
plt.figure(dpi=100)
x = np.arange(1,13)
y1 = np.array([568,645,789,412,435,673,345,632,467,876,912,1222])
y2 = np.array([675,412,545,645,831,345,459,734,812,611,1500,900])
plt.plot(x,y1,c="r",marker="*",ls="-",label="2019年销售额")
plt.plot(x,y2,c="g",marker="v",ls="--",label="2020年销售额")
plt.legend(loc="best",ncol=2)

plt.title("2019-2020年销售额对比图")
plt.xlabel("月份")
plt.ylabel("销售额")

plt.xticks(np.arange(1,13),[str(i)+"月" for i in range(1,13)])

p1 = zip(x,y1)
p2 = zip(x,y2)
for x,y1 in p1:
    plt.text(x,y1,y1,ha="center",va="bottom",fontsize=10)
    
for x,y2 in p2:
    plt.text(x,y2,y2,ha="center",va="bottom",fontsize=10)

plt.savefig("2019-2020年销售额对比图",dpi=300)

结果如下:

3、绘制柱形图

1)作用

  柱形图又叫条形图、柱状图,用来比较两个或以上的价值(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析。

2)语法格式和参数说明

① 语法格式

代码语言:javascript
复制
plt.bar(x,height,color,edgecolor,width=0.8,bottom=None,align=“center”)

② 参数说明

  • x 表示在x轴的哪个位置绘制柱形图;height表示每个柱子的高度。
  • color 表示柱子的颜色。
  • edgecolor 表示柱子边缘的颜色。
  • width 表示每个柱子的宽度。柱子的宽度可以相同,可以不同。
  • bottom 表示每个柱子的底部位置。每个柱子的底部位置可以相同,可以不同。
  • align 表示柱子的位置与x值的对应关系。可选center、edge参数。center表示柱子位于x值的中心位置,edge表示柱子位于x值的边缘位置。

3)演示说明

① 绘制某超市饮料类型和顾客性别的条形图

代码语言:javascript
复制
plt.figure(dpi=100)
x1 = [1,2,3,4,5]
y1 = [6,10,11,8,15]
x2 = [1,2]
y2 = [22,28]

plt.subplot(121)
plt.bar(x1,y1,width=0.5,align="center",color="r")
plt.title("不同饮料类型的人数对比图")
plt.xlabel("饮料类型")
plt.ylabel("数量")

plt.xticks([1,2,3,4,5],["果汁","矿泉水","绿茶","其它","碳酸饮料"])
plt.yticks(np.arange(0,16,3))

for x1,y1 in zip(x1,y1):
    plt.text(x1,y1,y1,ha="center",va="bottom",fontsize=10)

plt.subplot(122)
plt.bar(x2,y2,width=0.8,align="center",color="g")
plt.title("不同顾客性别的人数对比图")
plt.xlabel("顾客性别")
plt.ylabel("数量")

plt.xticks([1,2],["男","女"])
plt.yticks(np.arange(0,31,5))

for x2,y2 in zip(x2,y2):
    plt.text(x2,y2,y2,ha="center",va="bottom",fontsize=10)
    
plt.subplots_adjust(wspace=0.5)
plt.savefig("饮料类型和顾客性别",dpi=300)

结果如下:

② 绘制某超市不同饮料类型下,男女人数的对比图

代码语言:javascript
复制
plt.figure(dpi=100)
x = np.array([1,2,3,4,5])
y1 = np.array([1,6,7,2,6])
y2 = np.array([5,4,4,6,9])

plt.bar(x,y1,width=0.5,label="男",color="g")
plt.bar(x+0.5,y2,width=0.5,label="女",color="b")

plt.title("某超市不同饮料类型下男女人数的对比图")
plt.xlabel("饮料类型")
plt.ylabel("数量")

plt.legend(loc="best",title="顾客性别")

plt.xticks(x+0.15,["果汁","矿泉水","绿茶","其它","碳酸饮料"])
plt.yticks(np.arange(0,11,2))

for x,y1 in zip(x,y1):
    plt.text(x,y1,y1,ha="center",va="bottom",fontsize=10)

for x,y2 in zip(x+0.5,y2):
    plt.text(x,y2,y2,ha="center",va="bottom",fontsize=10)
    
plt.savefig("某超市不同饮料类型下男女人数的对比图",dpi=300)

结果如下:

4、绘制不同饮料类型的帕累托图

1)演示说明

① 绘制不同类型饮料的帕累托图

代码语言:javascript
复制
plt.figure(dpi=100)
x = np.array([1,2,3,4,5])
y1 = np.array([6,10,11,8,15])
# 先将y1中的元素,进行降序排序
y1 = np.sort(y1)[::-1]
y2 = y1.cumsum()/np.sum(y1)

plt.bar(x,y1,width=0.3,color="g")
plt.xlabel("饮料类型")
plt.ylabel("数量")
plt.xticks(x,["碳酸饮料","绿茶","矿泉水","其它","果汁"])
for xy1 in zip(x,y1):
    plt.annotate("{}".format(xy1[1]),xy=xy1,ha="center",va="bottom")

plt.twinx()
plt.plot(x,y2,color="r",lw=3)
plt.ylabel("百分比")
plt.yticks(np.arange(0,1.1,0.2))

plt.title("不同类型饮料的帕累托图")
plt.savefig("不同类型饮料的帕累托图",dpi=300)

结果如下:

5、绘制饼图

1)作用

  饼图用圆形及圆内扇形的角度来表示数值大小的图形,它主要用于表示一个样本(或总体)中各组成部分的数据占全部数据的比例。对于研究一个总体的结构性组成很有作用。

2)语法格式和参数说明

① 语法格式

代码语言:javascript
复制
plt.pie(x,y,height,color,edgecolor,width=0.8,bottom=None,align=“center”)

② 参数说明

  • x 表示要绘图的数据。
  • labels 每个部分显示的标签。
  • explode 指定每个部分距离圆心的偏移量(单位为半径的长度)。
  • colors 指定每个部分的颜色。
  • autopct 设置每个部分显示的比例值(格式化)。
  • counterclock 是否逆时针绘图。默认为True。
  • startangle 初始绘图点位置(逆时针偏移x轴的角度),默认为偏移0度(x轴)。
  • shadow 是否含有阴影,默认为False。(用处不大)

一些重要参数的图示说明:

3)演示说明

① 绘制不同饮料类型构成的饼图

代码语言:javascript
复制
plt.figure(dpi=100)
x1 = np.array([6,10,11,8,15])
x = x1/np.sum(x1)

labels = ["果汁","矿泉水","绿茶","其它","碳酸饮料"]
colors=["r", "g", "b", "y", "m"]
explode = [0.05,0,0,0,0]

plt.pie(x,labels=labels,colors=colors,autopct="%.0f%%",
        explode=explode,startangle=90,counterclock=False)
plt.axis("equal")

plt.savefig("不同饮料类型构成的饼图",dpi=300)

结果如下:

② 绘制环形图:以绘制三环形为例

操作如下:

代码语言:javascript
复制
plt.figure(figsize=(8,5),dpi=100)
x1 = [3496.57,1161.55,1251.09,1961.07]
x2 = [1383.36,775.09,595.09,1605.61]
x3 = [3756.56,1623.36,1730.51,3255.94]

labels = ["劳动者报酬","生产税金额","固定资产折旧","营业盈余"]
colors=['pink','greenyellow','lightcoral','cyan']
plt.pie(x1,colors=colors,autopct="%.0f%%",radius=1.3,
        wedgeprops=dict(width=0.3,edgecolor="w"),
        startangle=90,counterclock=False,pctdistance = 0.9)

plt.pie(x2,colors=colors,autopct="%.0f%%",radius=1,
        wedgeprops=dict(width=0.3,edgecolor="w"),
        startangle=90,counterclock=False,pctdistance = 0.85)

plt.pie(x3,colors=colors,autopct="%.0f%%",radius=0.7,
        wedgeprops=dict(width=0.3,edgecolor="w"),
        startangle=90,counterclock=False,pctdistance = 0.75)
plt.legend(labels=labels,loc="best",title="生产总值构成")

plt.title("生产总值构成的环形图")

plt.axis("equal")
plt.savefig("生产总值构成的环形图",dpi=300)

结果如下:

6、绘制直方图

① 语法格式

代码语言:javascript
复制
plt.pie(x,y,height,color,edgecolor,width=0.8,bottom=None,align=“center”)

② 参数说明

  • x 表示要绘图的数据。
  • labels 每个部分显示的标签。
  • explode 指定每个部分距离圆心的偏移量(单位为半径的长度)。
  • colors 指定每个部分的颜色。
  • autopct 设置每个部分显示的比例值(格式化)。
  • counterclock 是否逆时针绘图。默认为True。
  • startangle 初始绘图点位置(逆时针偏移x轴的角度),默认为偏移0度(x轴)。
  • shadow 是否含有阴影,默认为False。(用处不大)

③ 演示说明

代码语言:javascript
复制
df = pd.read_excel(r"C:\Users\黄伟\Desktop\matplotlib.xlsx",sheet_name="直方图")
def func(x):
    if x>=140 and x<150:
        return "(140,150]"
    elif x>=150 and x<160:
        return "(150,160]"
    elif x>=160 and x<170:
        return "(160,170]"
    elif x>=170 and x<180:
        return "(170,180]"
    elif x>=180 and x<190:
        return "(180,190]"
    elif x>=190 and x<200:
        return "(190,200]"
    elif x>=200 and x<210:
        return "(200,210]"
    elif x>=210 and x<220:
        return "(210,220]"
    elif x>=220 and x<230:
        return "(220,230]"
    elif x>=230 and x<240:
        return "(230,240]"
    
df["分组"] = df["销售量"].apply(func)
df1 = df.groupby("分组")["销售量"].count()
df1 = pd.DataFrame(df1)
df1 = df1.reset_index()
df1["频率"] = df1["销售量"].apply(lambda x:x/np.sum(df1["销售量"]))
df1["频率"] = df1["频率"].apply(lambda x:"{:.2%}".format(x))

plt.figure(figsize=(6,5),dpi=100)
plt.hist(df["销售量"],bins=[140,150,160,170,180,190,200,210,220,230,240],edgecolor='white',color="pink")
x = np.array([140,150,160,170,180,190,200,210,220,230,240])
plt.xticks(x+5,["{}-{}".format(x,x+10) for x in range(140,231,10)],rotation=90)
plt.yticks(np.arange(0,31,5))

for z in zip(x+2.5,df1["销售量"]):
    plt.annotate("{}".format(z[1]),xy=z,color="black")

plt.tight_layout()
plt.savefig("某电脑公司销售量分布的直方图",dpi=300)

结果如下:

未完待续,本系列还有最后一篇相关图形绘制(二)。

如果大家觉得文章对你有帮助,欢迎扫描下方二维码关注黄同学的CSDN博客

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 凹凸数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、绘制X轴、Y轴平行线
  • 2、绘制折线图
  • 3、绘制柱形图
  • 4、绘制不同饮料类型的帕累托图
  • 5、绘制饼图
  • 6、绘制直方图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档