matplotlib基本要点:
axis,轴,指的是x, y这种坐标轴
例子:假设一天中每隔两个小时(range(2,26,2))的气温(℃)分别是[15,13,14.5,17,20,25,26,26,27,22,18,15],用matplotlib绘出折线图
from matplotlib import pyplot as plt
# x,y要求是可迭代对象
x = range(2, 26, 2)
y = [15, 13, 14.5, 17, 20, 25, 26, 26, 27, 22, 18, 15]
plt.plot(x, y) # 传入x,y
plt.show() # 展示图像
效果如下图:
存在的问题:
1.设置图片大小(想要一个高清无码大图) —— plot
2.保存到本地 —— figure
3.描述信息,比如x轴和y轴表示什么,这个图表示什么 —— savefig
4.调整x或者y的刻度的间距 —— xticks
5.线条的样式(比如颜色,透明度等) —— plot
6.标记出特殊的点(比如告诉别人最高点和最低点在哪里) —— annotate
7.给图片添加一个水印(防伪,防止盗用)
解决问题:
1、设置图片大小(想要一个高清无码大图)
2、保存到本地
import matplotlib.pyplot as plt
# dpi参数可以是图片更加清晰
fig = plt.figure(figsize=(20,8),dpi=80)
x = range(2, 26, 2)
y = [15, 13, 14.5, 17, 20, 25, 26, 26, 27, 22, 18, 15]
plt.plot(x, y)
plt.savefig("./sig_size.png") # 保存为svg矢量图放大不会存在锯齿
plt.show()
3、描述信息,比如x轴和y轴表示什么,这个图表示什么
4、调整x或者y的刻度的间距
import matplotlib.pyplot as plt
x = range(2, 26, 2)
y = [15, 13, 14.5, 17, 20, 25, 26, 26, 27, 22, 18, 15]
plt.plot(x, y)
plt.xticks(x) # 按照x的值来设置x轴。
# plt.xticks(range(2,26)) 更改可以改变x轴显示步长
# plt.xticks([i/2 for i in range(2*2, 26*2+1)], rotation=45) 步长为0.5
plt.show()
例题:
如果列表a表示10点到12点的每一分钟的气温,如何绘制折线图观察每分钟气温的变化情况? 其中:
a = [random.randint(20,35) for i in range(120)]
import matplotlib.pyplot as plt
import numpy as np
plt.figure(figsize=(20, 8), dpi=80)
a = [np.random.randint(20, 35) for i in range(120)]
temperature = a
clock = range(0, 120)
_clock = clock[::10]
clock_labels = ["10点{}分".format(i) for i in range(60)]
clock_labels += ["11点{}分".format(i) for i in range(60)]
plt.plot(clock, temperature)
plt.xticks(_clock, clock_labels[::10])
plt.xlabel("时间")
plt.ylabel("温度(℃)")
plt.title("10点到12点每分钟的气温变化情况")
plt.show()
设置中文字体:在Windows下找到对应python环境的目录下的./Lib/site-packages/matplotlib/mpl-data/matplotlibrc
文件,打开后搜索font.sans-serif
,在冒号后面第一个加上“Microsoft YaHei”,保存即可。
例题:
假设大家在30岁的时候根据自己的实际情况,统计出来了从11岁到30岁每年交的女(男)朋友的数量如列表a,请绘制出该数据的折线图,以便分析自己每年交女(男)朋友的数量走势。
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
要求: y轴表示个数;x轴表示岁数,比如11岁,12岁等
import matplotlib.pyplot as plt
import numpy as np
friendNumber = [1, 0, 1, 1, 2, 4, 3, 2, 3, 4, 4, 5, 6, 5, 4, 3, 3, 1, 1, 1]
age = np.arange(11, 31)
plt.figure(figsize=(20, 8), dpi=80)
_age_label = ["{}岁".format(i) for i in range(11, 31)]
plt.plot(age, friendNumber)
plt.xticks(age, _age_label)
plt.yticks(friendNumber)
plt.xlabel("年龄")
plt.ylabel("个数")
plt.title("11岁至30岁每年交往女(男)朋友个数走势图")
plt.show()
画多线图的时候,可以加上图例,只需要在label=" "
,如果不显示可以在加上plt.legend()
自定义绘图风格
plt.plot(
x, # x
y, # y
color='r', # 线条颜色 r 红色 g 绿色 b 蓝色 w 白色 c 青色 m 洋红 y 黄色 k 黑色
linestyle='--', # 线条风格 - 实线 -- 虚线 -. 点划线 : 点虚线 '' 留空无线条
linewidth=5, # 线条粗细
alpha=0.5, # 透明度0~1
)
绘制散点图
scatter()
假设通过爬虫你获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温和随时间(天)变化的某种规律?
a =[11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
b =[26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,5,5,13,17,10,11,13,12,13,6]
import matplotlib.pyplot as plt
import numpy as np
y_3 = [11, 17, 16, 11, 12, 11, 12, 6, 6, 7, 8, 9, 12, 15, 14, 17, 18, 21, 16, 17, 20, 14, 15, 15, 15, 19, 21, 22, 22, 22, 23]
y_10 = [26, 26, 28, 19, 21, 17, 16, 19, 18, 20, 20, 19, 22, 23, 17, 20, 21, 20, 22, 15, 11, 5, 5, 13, 17, 10, 11, 13, 12, 13, 6]
x = np.arange(1, 32)
plt.scatter(x, y_3, label='3月', color='b')
plt.scatter(x, y_10, label='10月', color='r')
param1 = np.polyfit(x, y_3, 1)
param2 = np.polyfit(x, y_10, 1)
y_3_1 = param1[0]*x + param1[1]
y_10_1 = param2[0]*x + param2[1]
plt.plot(x, y_10_1, color='r')
plt.plot(x, y_3_1, color='b')
plt.legend()
plt.show()
绘制条形图
bar() & barh()
假设你获取到了2017年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据?
a =["战狼2","速度与激情8" ,"功夫瑜伽","西游伏妖篇","变形金刚5︰最后的骑士" ,"摔跤吧!爸爸","加勒比海盗5︰死无对证""金刚:骷髅岛","极限特工︰终极回归","生化危机6︰终章","乘风破浪","神偷奶爸3" ,"智取威虎山","大闹天竺" ,"金刚狼3∶殊死一战" ,"蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊"]
b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
单位:亿
import matplotlib.pyplot as plt
a = ["战狼2", "速度与激情8" , "功夫瑜伽", "西游伏妖篇", "变形金刚5︰最后的骑士", "摔跤吧!爸爸", "加勒比海盗5︰死无对证", "金刚:骷髅岛", "极限特工︰终极回归", "生化危机6︰终章",
"乘风破浪", "神偷奶爸3", "智取威虎山", "大闹天竺", "金刚狼3∶殊死一战", "蜘蛛侠:英雄归来", "悟空传", "银河护卫队2", "情圣", "新木乃伊"]
b = [56.01, 26.94, 17.53, 16.49, 15.45, 12.96, 11.8, 11.61, 11.28, 11.12, 10.49, 10.3, 8.75, 7.55, 7.32, 6.99, 6.88, 6.86, 6.58, 6.23]
plt.figure(figsize=(15, 8))
plt.barh(range(len(a)), b)
plt.yticks(range(len(a)), a, rotation=0)
plt.ylabel("单位:亿")
plt.show()
例题:
假设你知道了列表a中电影分别在2017-09-14(b_14),2017-O9-15(b_15),2017-09-16(b_16)三天的票房,为了展示列表中电影本身的票房以及同其他电影的数据对比情况,应该如何更加直观的呈现该数据?
a=["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
b_16=[15746,312,4497,319]
b_15=[12357,156,2045,168]
b_14 = [2358,399,2358,362]
import matplotlib.pyplot as plt
a = ["猩球崛起3:终极之战", "敦刻尔克", "蜘蛛侠:英雄归来", "战狼2"]
b_16 = [15746, 312, 4497, 319]
b_15 = [12357, 156, 2045, 168]
b_14 = [2358, 399, 2358, 362]
plt.bar([i-0.2 for i in range(len(a))], b_14, width=0.2, label='9月14日')
plt.bar([i for i in range(len(a))], b_15, width=0.2, label='9月15日')
plt.bar([i+0.2 for i in range(len(a))], b_16, width=0.2, label='9月16日')
plt.xticks(range(len(a)), a)
plt.legend()
plt.show()
绘制直方图
hist()
假设你获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟电影的数量,出现的频率)等信息,你应该如何呈现这些数据?
a = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 13, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 11, 78, 132, 124, 113, 150, 110, 17, 86, 95, 144, 105, 126, 130, 126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136, 123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127, 105, 120, 107, 129, 16, 108, 132, 103, 136, 18, 102, 120, 14, 105, 15, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134, 156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102, 123, 107, 143, 115, 136, 18, 139, 123, 112, 118, 125, 109, 119, 133, 112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 12, 135, 15, 146, 137, 116, 103, 144, 83, 123, 11, 110, 11, 100, 154, 136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 11, 109, 141, 120, 117, 106, 149, 122, 122, 110, 119, 127, 121, 114, 125, 126, 114, 140, 103, 130, 141, 117, 106, 14, 121, 114, 133, 137, 92, 121, 12, 146, 97, 137, 105, 96, 117, 112, 81, 97, 139, 113, 134, 106, 144, 10, 137, 137, 11, 104, 117, 100, 111, 101, 110, 105, 129, 137, 112, 120, 113, 133, 12, 83, 94, 146, 133, 101, 131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111, 111, 133, 150]
首先要考虑数据分为多少组去统计。当数据在100个以内时,按数据多少分为5-12个组。组距是指每个小组的两个端点的距离,组数=(max(a)-min(a))/ (bin_width)
import matplotlib.pyplot as plt
a = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 13, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124,
101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 11, 78, 132, 124, 113, 150, 110, 17, 86,
95, 144, 105, 126, 130, 126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136, 123, 117, 119, 105, 137, 123,
128, 125, 104, 109, 134, 125, 127, 105, 120, 107, 129, 16, 108, 132, 103, 136, 18, 102, 120, 14, 105, 15, 132, 145,
119, 121, 112, 139, 125, 138, 109, 132, 134, 156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102, 123, 107, 143,
115, 136, 18, 139, 123, 112, 118, 125, 109, 119, 133, 112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 12, 135,
15, 146, 137, 116, 103, 144, 83, 123, 11, 110, 11, 100, 154, 136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 11, 109,
141, 120, 117, 106, 149, 122, 122, 110, 119, 127, 121, 114, 125, 126, 114, 140, 103, 130, 141, 117, 106, 14, 121, 114,
133, 137, 92, 121, 12, 146, 97, 137, 105, 96, 117, 112, 81, 97, 139, 113, 134, 106, 144, 10, 137, 137, 11, 104, 117, 100,
111, 101, 110, 105, 129, 137, 112, 120, 113, 133, 12, 83, 94, 146, 133, 101, 131, 116, 111, 84, 137, 115, 122, 106, 144,
109, 123, 116, 111, 111, 133, 150]
plt.hist(a, 20)
plt.show()
matplotlib的更多实践,其实不如通过现有的工具去实现有更好的效果
可以用下面这个工具
echarts