matplotlib是PYTHON绘图的基础库,是模仿matlab绘图工具开发的一个开源库。 PYTHON其它第三方绘图库都依赖与matplotlib
折线图 plot chart
特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
# 导入matplotlib.pyplot 模块
import matplotlib.pyplot as plt
import random
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签/如果想默认为SimHei,可直接在配置文件中修改
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
%matplotlib inline
# 数据准备
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
# 增加北京的温度数据
y_beijing = [random.uniform(1, 3) for i in x]
# 创建画布(容器层) figsize:指定图的长宽,dpi:图像的清晰度
plt.figure(figsize=(15,4),dpi=80)
# 绘制折线图(图像层)
plt.plot(x, y_shanghai, label="北京")
# 使用多次plot可以画多个折线
plt.plot(x, y_beijing, color='r', linestyle='-.', label="北京")
# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 显示图例
plt.legend(loc=0)
# 构造y轴刻度
y_ticks = range(40)
# 修改x,y轴坐标的刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
# 添加网格显示
plt.grid(True, linestyle='--', alpha=0.5)
# 添加x轴、y轴描述信息及标题
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点0分到12点之间的温度变化图示")
# 保存图片到指定路径
plt.savefig("test.png")
# 注意:plt.show()会释放figure资源,所以要在plt.show()前面。
# 显示图像
# plt.show()
# 多个坐标系显示-plt.subplots(面向对象的画图方法)
# matplotlib.pyplot.subplots(nrows=1, ncols=1, **fig_kw) 创建一个带有多个axes(坐标系/绘图区)的
# 折线图的排列方式
fig,axes = plt.subplots(nrows=1,ncols=2, figsize=(20, 5), dpi=80)
# 2)绘制折线图
axes[0].plot(x, y_shanghai, label="上海")
axes[1].plot(x, y_beijing, color='r', linestyle='--', label="北京")
axes[0].legend()
axes[1].legend()
# 使用subplot
plt.figure(figsize=(20, 8))
plt.subplot(1,2,1)
plt.plot(x, y_shanghai, label="上海")
plt.subplot(1,2,2)
plt.plot(x, y_beijing, color='r', linestyle='--', label="北京")
柱状图 bar chart¶
绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)
verticle 图垂直
data = [5,25,50,20]
plt.bar(range(len(data)),data)
horizontal 图水平
data = [5,25,50,20]
plt.barh(range(len(data)),data)
多个bar
import numpy as np
data = [[5,25,50,20],
[4,23,51,17],
[6,22,52,19]]
X = np.arange(4)
plt.bar(X + 0.00, data[0],color='b',width=0.25,label="A")
plt.bar(X + 0.20, data[0],color='y',width=0.25,label="B")
plt.bar(X + 0.50, data[0],color='r',width=0.25,label="C")
plt.legend(loc='best')
stacked 多个图叠加
data = [[5,25,50,20],
[4,23,51,17],
[6,22,52,19]]
X = np.arange(4)
plt.bar(X+0.25, data[0], color = 'b', width = 0.25)
plt.bar(X, data[1], color = 'y', width = 0.25,bottom=data[0])
plt.bar(X, data[0], color = 'r', width = 0.25,bottom=np.array(data[0])+np.array(data[1]))
scatter points 散点图
散点图用来衡量两个连续变量之间的相关性
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.randn(N)
# 调整大小
area = np.pi*(15*np.random.rand(N)**2)
plt.scatter(x, y,c=colors,s=area)
histogram 直方图¶
直方图是用来衡量连续变量的概率分布的。在构建直方图之前,我们需要先定义好bin(值的范围),也就是说我们需要先把连续值划分成不同等份,然后计算每一份里面数据的数量
a = np.random.rand(100)
plt.hist(a,bins=20)
plt.ylim(0,14)
a = np.random.randn(10000)
plt.hist(a,bins=50)
plt.title("标准正态分布")
boxplots 箱型图
用于表达连续特征的百分位数分布。统计学上经常被用于检测单变量的异常值,或者用于检查离散特征和连续特征的关系
x = np.random.randint(20,100,size=(30,3))
plt.boxplot(x)
plt.ylim(0,120)
plt.xticks([1,2,3],['A','B','C'])
# 横线 横线开始横坐标,横线结束横坐标 ,vlines是竖线
plt.hlines(y = np.mean(x,axis = 0)[1],xmin=0,xmax=3)
颜色调整与添加文字 color /text
# 画布颜色
fig,axs = plt.subplots(facecolor='darkseagreen')
data = [[5,25,50,20],
[4,23,51,17],
[6,22,52,19]]
X = np.arange(4)
# 图形颜色
plt.bar(X,data[0],color='darkorange',width=0.25,label="A")
plt.bar(X+0.25,data[1],color='blue',width=0.25,label="B")
plt.bar(X+0.5,data[2],color='violet',width=0.25,label="C")
axs.set_title('Figur 1')
axs.legend()
#添加文字
plt.text(1.0,30,"lalal")
W = [0.00,0.25,0.50]
for i in range(3):
# zip() 函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象。
for a,b in zip(X+W[i],data[i]):
plt.text(a,b,"%.0f"% b,ha="center",va="bottom")
plt.xlabel("Group")
plt.ylabel("Num")
注释
在数据可视化的过程中,图片中的文字经常被用来注释图中的一些特征。使用annotate()方法可以很方便地添加此类注释。在使用annotate时,要考虑两个点的坐标:被注释的地方xy(x, y)和插入文本的地方xytext(x, y)
X = np.linspace(0, 2*np.pi,100)# 均匀的划分数据
Y = np.sin(X)
Y1 = np.cos(X)
plt.plot(X,Y)
plt.plot(X,Y1)
plt.annotate("Y",
xy=(1, np.sin(1)),
xytext=(2,0.5),fontsize=14,
arrowprops=dict(arrowstyle="->"))
plt.title("这是一副测试图")
subplots 用法
plt.rcParams['figure.figsize'] = (10, 6) # 调整图片大小
np.random.seed(19680801) #随机数种子,设置后让每次生成的随机数一致
n_bins = 10
x = np.random.randn(1000, 3)
fig,axes = plt.subplots(2,2,facecolor="darkorange")
ax0, ax1, ax2, ax3 = axes.flatten() #将拆分的区域进行分发
colors = ['red', 'tan', 'lime']
ax0.hist(x, n_bins, normed=1, histtype='bar', color=colors, label=colors)
ax0.legend(prop={'size': 10})
ax0.set_title('bars with legend')
ax1.hist(x, n_bins, normed=1, histtype='bar', stacked=True)
ax1.set_title('stacked bar')
ax2.hist(x, n_bins, histtype='step', stacked=True, fill=False)
ax2.set_title('stack step (unfilled)')
# x_multi = [np.random.randn(n) for n in [10000, 5000, 2000]]
# ax3.hist(x_multi, n_bins, histtype='bar')
# ax3.set_title('different sample sizes')
fig.tight_layout() # Adjust subplot parameters to give specified padding.自动调整一个合适的大小
ShareX or ShareY 共享xy轴
N_points = 100000
n_bins = 20
x = np.random.randn(N_points)
y = .4 * x + np.random.randn(100000) + 5
fig, axs = plt.subplots(1, 2, sharey=True, tight_layout=True)
axs[0].hist(x,bins=n_bins)
axs[1].hist(y,bins=n_bins)
pandas api 使用pandas调用matplotlib¶
import pandas as pd
df = pd.read_csv("stock_day.csv",sep=',')
df.head()
# 散点图
df.plot.scatter(x="open",y="close",c="volume")
# 直方图
df[["open","close"]].plot.hist()
# 箱型图
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
df.plot.box()