matplotlib(三)-周报继续……

开始吧,第二张图


这张图有三个地方要注意的:

  1. 建立了次坐标轴;
  2. 图表上标注了每个数据的刻度值;
  3. 图例:主坐标轴和次坐标轴的图例放在一起。 给自己打打气吧

一、建立次坐标轴

fig = plt.figure(figsize=(9,4))
ax1 = fig.add_subplot(111)
ax2 = ax1.twinx()

ax2 = ax1.twinx()
创建一个与ax1共享x轴的ax2。
此外,matplotlib还有一个twiny()函数,可以创建一个共享y轴的此坐标轴。

二、标注数据刻度

plt.text(x=0.5, y=0.5, s=32123)

plt.text()函数可以在图表上的制定位置,写下指定的值。
第一个参数x表示文字的横坐标位置,
第二个参数y表示文字的纵坐标位置,
第三个参数s表示要写的文字是什么。
还可以设置文字的大小,样式,颜色,背景颜色等。具体可看官网plt.text()

三、图例

line1, = ax1.bar(x, height=money, label="订单额", width=0.25,facecolor="#4F8B83" )
line2, = ax2.plot(x,wow,color="#FAC599",label="环比")
line3, = ax2.plot(x,yoy,color="#E76178",label="同比")
plt.legend((line1, line2, line3), ("订单额", "环比", "同比"), bbox_to_anchor=(1.25,0.7), edgecolor="none", facecolor="none")

line1, = ax.plot([1, 2, 3], label="订单额")
ax.plot([1, 2, 3], label="订单额") 返回一个元组,
line1, 加个逗号,再赋值,表示把返回的元组的第一个元素,赋给line1。
plt.legend((line1, line2, line3), ("订单额", "环比", "同比"))
把这三条线的图例写在一起。

完整代码:

#coding:utf8
import matplotlib.pyplot as plt
import numpy as np  

#—————————————步骤一获取数据——————————————
#数据每周的订单金额(money)环比wow),同比(yoy)
#横坐标数据第几周
money = [45642,59538,73871,54833]
wow = [-0.52,-0.52,-0.57,-0.37]
yoy = [-0.18,0.30,0.24,-0.26]
weeks = ["第1周","第2周","第3周","第4周",]

#—————————————步骤二创建图像——————————————
#创建一个画板fig创建第一张图ax1
fig = plt.figure(figsize=(9,4))
ax1 = fig.add_subplot(111)

#————————步骤三画订单额的图————————————————
#plt.bar画出柱形图
#第一个参数是横坐标的列表参数height是纵坐标的列表参数width是柱子的宽度facecolor设置柱形图填充颜色
x = range(len(weeks))
line1, = ax1.bar(x, height=money, label="订单额", width=0.25,facecolor="#4F8B83" )

#————————步骤四设置细节——————————
plt.title("订单额")
#设置x轴的坐标刻度名称设置y轴坐标刻度颜色
plt.xticks(x,weeks,color="#999999")
plt.yticks(color="#999999")

#在图表上添加每个数据的刻度
for i,j in zip(x,money):
    plt.text(i,j+2000,j,ha="center",va="bottom",color="#333333")

#设置坐标轴顶部底部无颜色
ax1.spines["top"].set_color("none")
ax1.spines["bottom"].set_color("#aaaaaa")
ax1.spines["left"].set_color("#aaaaaa")
ax1.spines["right"].set_color("#aaaaaa")

#————————步骤五画次坐标轴图——————————
#画次坐标轴ax2 = ax1.twinx() 表示ax2是和ax1共用一个x轴坐标的图表
#也有twiny()方法是共用y轴坐标
ax2 = ax1.twinx()
line2, = ax2.plot(x,wow,color="#FAC599",label="环比")
line3, = ax2.plot(x,yoy,color="#E76178",label="同比")


#————————步骤六设置次坐标轴的细节——————————
plt.yticks(np.linspace(-0.5,0.5,5),[format(i, ".0%") for i in np.linspace(-0.5,0.5,5)],color="#999999")
#添加数据刻度
for i,j in zip(x,wow):
    plt.text(i+0.15,j,format(j,".0%"),ha="left",va="center",color="#333333")
for i,j in zip(x,yoy):
    plt.text(i+0.15,j,format(j,".0%"),ha="left",va="center",color="#333333")
#调整间距
plt.subplots_adjust(right=0.8)
#设置坐标轴边框颜色
ax2.spines["top"].set_color("none")
ax2.spines["bottom"].set_color("#aaaaaa")
ax2.spines["left"].set_color("#aaaaaa")
ax2.spines["right"].set_color("#aaaaaa")
#设置图例
plt.legend((line1, line2, line3), ("订单额", "环比", "同比"),bbox_to_anchor=(1.25,0.7),edgecolor="none",facecolor="none")

#————————步骤七保存图片——————————
plt.savefig("gmv.png",transparent=True,format='png')
plt.show()

继续,第三张图


这张图需要注意的是堆积条形图。

fig = plt.figure(figsize=(9,2))
ax = fig.add_subplot(1,1,1)
y = [1,1.5]
ax.barh(y,width=before_data,height=0.3,left=0,label="之前",facecolor="#4F8B83")
ax.barh(y,width=week_data,height=0.3,left=before_data,label="本周",facecolor="#E76178")
ax.barh(y,width=left_data,height=0.3,left=[i+j for i,j in zip(before_data,week_data)],label="剩余",facecolor="#D7DDDB")

ax.barh(y,width=before_data,height=0.3,left=0,label="之前",facecolor="#4F8B83")
绘制条形图。
其中第一个参数,是条形图在y轴的坐标列表;
参数width是这个条形图的值;
参数height来控制条形图的粗细;
参数left,来设置条形图左边的开始位置,这个参数用来做堆积条形图。
可以看到第一个ax.barh() 参数left的值是0,第二个ax.barh()参数left的值是之前数据,第三个ax.barh()参数left的值 是之前数据加上本周数据。

完整代码

#coding:utf8
import matplotlib.pyplot as plt 
import numpy as np 

#—————————————步骤一获取数据——————————————
#获取数据之前订单和流量的百分比before_data),
#本周订单和流量完成的百分比week_data),剩余订单和流量的百分比left_data
before_data = [0.31,0.26]
week_data = [0.21,0.23]
left_data = [0.48,0.51]

#—————————————步骤二画出图形——————————————
# 条形图在Y轴的坐标列表
y = [1,1.5]
#创建图像
fig = plt.figure(figsize=(9,2))
ax = fig.add_subplot(1,1,1)
#画出条形图
#barh用于画水平柱状图
#x,第一个参数用来标记bar的y坐标位置但这个参数名称用x或用y都会报错不知道参数名称是啥
#widthbar的宽度
#heightbar的粗细,可以用列表来设置每个bar的粗细默认是0.8
#left表示x坐标开始的位置用来绘制堆积条形图
ax.barh(y,width=before_data,height=0.3,left=0,label="之前",facecolor="#4F8B83")
ax.barh(y,width=week_data,height=0.3,left=before_data,label="本周",facecolor="#E76178")
ax.barh(y,width=left_data,height=0.3,left=[i+j for i,j in zip(before_data,week_data)],label="剩余",facecolor="#D7DDDB")

#—————————————步骤三设置细节——————————————
plt.title("本周进度")
#设置y坐标轴的刻度名称
plt.yticks([1,1.5],[r"$UV$",r"$GMV$"])
#设置x坐标轴以百分数显示
plt.xticks(np.linspace(0,1,5),[format(i, ".0%") for i in np.linspace(0,1,5)],color="#111111")

#设置图例的位置边框颜色填充颜色
ax.legend(bbox_to_anchor=(1.1,0.7),edgecolor="none",facecolor="none")

#添加数据刻度值
for i,j in zip(before_data,y):
    plt.text(i-0.1,j,format(i, ".0%"),ha="right",va="center",color="#ffffff")
for i,j,k in zip(week_data,y,before_data):
    plt.text(i+k-0.1,j,format(i, ".0%"),ha="right",va="center",color="#ffffff")
for i,j,k,z in zip(left_data,y,before_data,week_data):
    plt.text(i+k+z-0.1,j,format(i, ".0%"),ha="right",va="center",color="#ffffff")

#设置坐标轴边框无颜色
ax.spines["right"].set_color("none")
ax.spines["bottom"].set_color("none")
ax.spines["left"].set_color("#dddddd")
ax.spines["top"].set_color("none")

#—————————————步骤四保存图片——————————————
plt.savefig("process.png",transparent=True,format='png',dpi=1000)
plt.show()

matloplib文章:

  1. matplotlib(一)-就是这么一个画图的
  2. matplotlib(二)-一个周报引发的故事
  3. matplotlib(三)-周报继续……
  4. matplotlib(四)-中文乱码等问题记录
2018-01-30 13:2390matplotlib