绘制某种图表时,首先根据数据绘制出大体的轮廓,然后再根据需要进行细节的调整。
折线图基础代码
from matplotlib import pyplot as plt
x = range(2,11,2)
y = [2,3,4,5,6]
z = [3,4,5,6,7]
fig = plt.figure(figsize=(10,4),dpi=80) #figsize表示图片大小,dpi表示图片清晰程度
#图像线条的属性设置,颜色可以用颜色代码16进制
plt.plot(x,y,label="defeat",color="r",linestyle=":",linewidth=5,alpha=0.7)
plt.plot(x,z,label="victory",color="yellow",linestyle="--")
#添加网格,alpha表示透明度
plt.grid(alpha=0.5)
#设置x轴的刻度
xtick_labels = [i/2 for i in range(4,21)]#刻度之间相隔0.5,直接range(2,11,0.5)是不对的,0.5是float,
#可以用这种方式设置,注意除以2之后才是原来的刻度!
plt.xticks(xtick_labels)#给x轴刻度传什么值,就会显示什么
#设置y轴的刻度
plt.yticks(range(min(y),max(z)+1))
#添加图例,添加图例的前提是为不同的先设置好label
plt.legend(loc="upper left")
plt.savefig("./t1.png") #保存图片,相对路径(也可以保存为.svg的图片格式,表示可缩放的矢量图格式,放大不会有锯齿)
plt.show()
折线图应用
#10点到12点的温度变化折线图
from matplotlib import pyplot as plt
import random
#需要显示中文,加上这三行代码
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = range(0,120)#range形成的是数组形式(1,2,3,...)
y = [random.randint(20,35) for i in range(120)]
fig = plt.figure(figsize=(10,4),dpi=80)
plt.plot(x,y,label="温度")
#调整x轴刻度
xtick_labels = ["10点{}分".format(i) for i in range(60)]
xtick_labels += ["11点{}分".format(i) for i in range(60)]
#[::3]取步长,使数字和字符串一一对应,数据的长度必须一样
plt.xticks(list(x)[::5],xtick_labels[::5],rotation=45)#rotation表示x轴刻度旋转的度数
#添加图的描述信息
plt.xlabel("时间")
plt.ylabel("温度(℃)")
plt.title("10点到12点的温度变化情况")
#添加网格
plt.grid(alpha=0.5)
#添加图例,前提是为线条设置好label属性,loc设置位置
plt.legend(loc="upper left")
plt.show()
绘制散点图基础代码
#绘制散点图
from matplotlib import pyplot as plt
import random
#需要显示中文,加上这三行代码
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
y_1 = [2,3,1,3,5,6,1,4,9,8,4,3,1,3,3,6,8,9,9,7,9,8,10,12,11,9,9,7,8,13,12]
y_4 = [12,13,11,13,15,16,11,14,19,18,14,13,11,13,13,16,18,19,19,17,19,18,20,22,21,19,19,17,18,23]
x_1 = range(1,32)
x_4 = range(51,81)
#设置图像大小
plt.figure(figsize=(10,4),dpi=80)
#绘制散点图
plt.scatter(x_1,y_1,label="一月份")
plt.scatter(x_4,y_4,label="三月份")
plt.plot(x_1,y_1,label="一月份")
plt.plot(x_4,y_4,label="三月份")
plt.legend()
#调整x轴刻度
_x = list(x_1)+list(x_4)
_xtick_labels = ["1月{}日".format(i) for i in x_1]
_xtick_labels += ["4月{}日".format(i) for i in x_4]
plt.xticks(_x[::3],_xtick_labels[::3],rotation=45)
#添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.show()
柱形图的绘制
#绘制柱形图
from matplotlib import pyplot as plt
import random
#需要显示中文,加上这三行代码
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(10,4),dpi=80)
plt.title("各英雄在上中下路的胜率")
x = ["小乔","貂蝉","诸葛亮","嫦娥","女娲","王昭君","张良"]
y = [12,13,11,13,15,16,11]
z = [13,14,15,16,17,17,12]
p = [15,12,15,18,12,10,14]
wid = 0.2
#→右移一个(两个宽度)
x_y = list(range(len(x)))
x_z = [i+wid for i in x_y]
x_p = [i+wid*2 for i in x_y]
plt.bar(x_y,y,width=wid,label="对抗路")
plt.bar(x_z,z,width=wid,label="中路")
plt.bar(x_p,p,width=wid,label="发育路")
#调整x轴标签
plt.xticks(x_z,x,rotation=45)
plt.legend(loc="upper right")
plt.show()
条形图的绘制
#绘制条形图
from matplotlib import pyplot as plt
import random
#需要显示中文,加上这三行代码
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(10,4),dpi=80)
plt.title("各英雄在上中下路的胜率")
x = ["小乔","貂蝉","诸葛亮","嫦娥","女娲","王昭君","张良"]
y = [12,13,11,13,15,16,11]
z = [13,14,15,16,17,17,12]
p = [15,12,15,18,12,10,14]
wid = 0.2
#→右移一个(两个高度)
x_y = list(range(len(x)))
x_z = [i+wid for i in x_y]
x_p = [i+wid*2 for i in x_y]
#!!!!!!与柱形图不同
plt.barh(x_y,y,height=wid,label="对抗路")
plt.barh(x_z,z,height=wid,label="中路")
plt.barh(x_p,p,height=wid,label="发育路")
#调整y轴标签!!!!!!!!!!与柱形图不同
plt.yticks(x_z,x,rotation=45)
plt.legend(loc="upper right")
plt.savefig("./t5.png")
plt.show()
直方图的绘制
直方图应用:
用户年龄的分布状态
一段时间内,用户点击次数的分布状态
用户活跃时间的分布状态
直方图调整x轴刻度是一件很困难的事
#绘制直方图
from matplotlib import pyplot as plt
import random
#需要显示中文,加上这三行代码
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(10,4),dpi=80)
a = [12,13,11,13,15,16,21,16,43,56,58,35,44,34,23,14,19,18,24,23,21,23,23,26,18,19,19,17,19,18,20,22,21,19,19,17,18,23]
bin_width = 2#组距
#计算组数(max-min)//bin_width(整除)
num_bins = (max(a)-min(a))//bin_width
plt.hist(a,num_bins)
#设置x轴刻度
plt.xticks(list(range(min(a),max(a)+bin_width)))
plt.grid()
plt.savefig("./t6.png")
plt.show()
总结
根据具体的问题选择适合的图形,更多好看的图形见Examples — Matplotlib 3.5.2 documentation
更多可视化工具:echartsExamples - Apache ECharts
plotly比matplotlib更加简单,图形更加漂亮,兼容matplotlib和pandas,使用方法简单,照着文档写即可Plotly Python Graphing Library