内容是以前的学习笔记,内容不全,主观性较大,部分基础知识未展示
Matplotlib
- 比较:比较数据间各类别的关系,或者是它们随着时间的变化趋势,比如折线图;
- 联系:查看两个或两个以上变量之间的关系,比如散点图;
- 构成:每个部分占整体的百分比,或者是随着时间的百分比变化,比如饼图;
- 分布:关注单个变量,或者多个变量的分布情况,比如直方图
# Jupyter运行matplotlib
%matplotlib inline
颜色 color
- ‘b’:蓝色(blue)
- ‘g’:绿色(green)
- ‘r’:红色(red)
- ‘c’:青色(cyan)
- ‘m’:品红(magenta)
- ‘y’:黄色(yellow)
- ‘k’:黑色(black)
- ‘w’:白色(white)
线型 linestyle
- ‘-‘:实线(solid line style)
- ‘–‘:虚线(dashed line style)
- ‘-.’:点划线(dash-dot line style)
- ‘:’:点线(dotted line style)
标记点 marker
- ‘.’:点(point marker)
- ‘,’:像素点(pixel marker)
- ‘o’:圆形(circle marker)
- ‘v’:朝下三角形(triangle_down marker)
- ‘^’:朝上三角形(triangle_up marker)
- ‘<‘:朝左三角形(triangle_left marker)
- ‘>’:朝右三角形(triangle_right marker)
- ‘1’:(tri_down marker)
- ‘2’:(tri_up marker)
- ‘3’:(tri_left marker)
- ‘4’:(tri_right marker)
- ‘s’:正方形(square marker)
- ‘p’:五边星(pentagon marker)
- ‘*’:星型(star marker)
- ‘h’:1号六角形(hexagon1 marker)
- ‘H’:2号六角形(hexagon2 marker)
- ‘+’:+号标记(plus marker)
- ‘x’:x号标记(x marker)
- ‘D’:菱形(diamond marker)
- ‘d’:小型菱形(thin_diamond marker)
- ‘|’:垂直线形(vline marker)
- ‘_’:水平线形(hline marker)
绘图基础
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
plt.rcParams['axes.unicode_minus'] = False # 解决符号问题
plt.plot(x,y,
ls=, # 线条风格
lw=2, # 线条宽度
c=, # 线条颜色
marker=, # 线条上点的形状
markersize=, # 线条上点的大小
markeredgecolor=, # 点的边框色
markerfacecolor=, # 点的填充色
label=) # 文本标签
plt.grid(ls='--',
c='darkblue') # 设置网格线
plt.axhline(y=1700,
c='red',
ls='--'
lw=2) # 设置平行于x轴的参考线
plt.axvline(x=4,
c='steelblue',
ls='-.',
lw=2) # 设置平行于y轴的参考线
plt.axvspan(xmin=4,
xmax=6,
facecolor='r',
alpha=0.3) # 设置平行于y轴的参考区,同理axhspan
plt.show()
图例
plt.plot(x,y,label='label')
plt.legend(loc='upper left', # 最好选择best自动匹配
fontsize=10,
frameon=False) # 图例是否有边框
fig = plt.gcf() # 返回一个图像设置对象
fig.set_size_inches(12.5, 10.5) # 设置图像大小
plt.show()
子图
fig = plt.figure(figsize=(10, 5)) # 创建画布可以设置大小
ax1 = fig.add_subplot(1, 2, 1) # 设置子图,1行2列第1个
ax2 = fig.add_subplot(1, 2, 2, sharey=ax1) # 1行2列第2个,且两个子图共享y轴
# 会员直方图
ax1.hist(year_member_duration, range=hist_range, bins=n_bins)
# 设置范围和分组个数
ax1.set_xticks(range(0, 181, 15))
ax1.set_title('Member')
ax1.set_ylabel('Count')
# 非会员直方图
ax2.hist(year_casual_duration, range=hist_range, bins=n_bins)
ax2.set_xticks(range(0, 181, 15))
ax2.set_title('Casual')
ax2.set_ylabel('Count')
plt.tight_layout()
plt.show()
饼状图
plt.figure()
plt.pie(n_users,
colors= ['c', 'b'], # 颜色
labels=['above zero', 'minus'], # 文本标签
labaldistance=1.2, # 文本标签设置在饼图外
textprops={'fontsize':10,
'color':'black'} # 设置文本属性
autopct='%.1f%%', # 计算百分比
shadow=True, # 阴影
explode=(0.05, 0.05),# 分离
pctdistance=0.5,# 百分比标签和圆心距离
wedgeprops={'linewidth':1.5,
'edgecolor':'green'} # 设置饼图边界的属性
)
plt.axis('equal') # 横纵坐标一样,形成正圆
plt.title('Title', pad=30) # 标题与图的距离
plt.tight_layout()
plt.show()
折线图
plt.figure()
plt.plot(results[0],linestyle='-', marker='o', label='count')
plt.plot(results[1],linestyle='-.', marker='h', label='max')
plt.plot(results[2],linestyle='--', marker='^', label='min')
plt.plot(results[3],linestyle=':', marker='*', label='mean')
# 可以通过一个函数直接画出多个折线
plt.xticks(range(0, 3), ['Jan.', 'Feb.', 'Mar.'], rotation=45)
# 修改x轴刻度变成标签
plt.xlabel('Month')
plt.ylabel('Describe')
plt.legend(loc='best')
plt.tight_layout()
plt.show()
# 时间序列分析用折线图较多
plt.figure(figsize=(10, 8))
plt.plot(x1,y1,'bs--', # color、marker、ls可以合并简写
x2,y2,'ro--',
x3,y3,'gH--')
plt.xlabel('Month',lablepad=25)
plt.ylabel('Describe')
plt.xticks(range(0, 4, 1),
['Jan.', 'Feb.', 'Mar.', 'Apr'],
rotation=45,
fontsize=10)
plt.legend(['first','Second','Third'],
loc='upper right',
ncol=1, # 排列成一行
frameon=False)
# seaborn折线图
import pandas as pd
import seaborn as sns
# 数据准备
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]
y = [5, 3, 6, 20, 17, 16, 19, 30, 32, 35]
# 使用Seaborn画折线图
df = pd.DataFrame({'x': x, 'y': y})
sns.lineplot(x="x", y="y", data=df)
plt.show()
# 几乎和matplotlib无区别
柱状图
plt.figure(figsize=(6.4, 4.8))
plt.bar(x,
height=, # 纵轴数据
width=0.5,
color='y',
linewidth=,
tick_label=x_data, # 横坐标标签
align='center') # 标签对齐方式
plt.xlabel('Month', labelpad=20)
plt.ylabel('Describe', fontsize=15)
plt.title('Title', pad=20)
plt.show()
# 画堆叠柱状图,需要先做透视图
plt.bar(x, height=data1, color='red', label=l1, tick_label)
plt.bar(x, height=data2, color='blue', label=l2, tick_label,
bottom=data1)
plt.bar(x, height=data3, color='green', label=l3, tick_label,
bottom=data1+data2) # 画在最上面
plt.legend(loc='best') # 各图的label
# 也可以把图例放外面
plt.legend(bbox_to_anchor=(1.1,0.8))
# 把整个图的横纵坐标视为1,1.08为距左的距离,0.8为距下的距离
plt.ylabel('ylabel')
plt.title('title')
plt.show()
# 也可以先做交叉表求比例再画均一化堆叠柱状图
# 分组柱状图 + 中文显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
plt.rcParams['axes.unicode_minus'] = False # 解决符号问题
bar_locs = np.arrange(4)
bar_width = 0.35 # 柱子宽度
plt.figure()
plt.bar(bar_locs,
member,
width=bar_width,
color='g',
alpha=0.7,
laber='会员')
plt.bar(bar_locs+bar_width, # 设置偏移量为柱子宽度
casual,
width=bar_width,
color='g',
alpha=0.7,
laber='非会员')
xtick_labels = [f'第{i+1}季度' for i in range(4)]
plt.xticks(bar_locs+bar_width/2, # 让刻度位置居中
xtick_labels,
rotation=45)
plt.ylabel('平均骑行时间')
plt.title('柱状图')
plt.legend(loc='best')
plt.tight_layout()
plt.savefig('..')
plt.show()
# seaborn条形图
import seaborn as sns
# 数据准备
x = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5']
y = [5, 4, 8, 12, 7]
# 用Seaborn画条形图
sns.barplot(x, y)
plt.show()
# 自带颜色划分
直方图
plt.figure(figsize=(10, 5)) # 创建画布可以设置大小
plt.hist(x=Titanic['Age'],
range=hist_range,
bins=n_bins, # 柱个数
edgecolor='red',
density=True) # 频数还是频率
plt.set_xticks(range(0, 181, 15))
plt.set_title('Casual')
plt.set_ylabel('Count')
plt.tight_layout()
plt.show()
# 加上正态分布图与核密度图
def normfun(x, mu, sigma):
pdf = np.exp(-((x-mu)**2/(2*sigma*2))/(sigma*np.sqrt(2*np.pi))
return pdf
mean_x = Titanic['Age'].mean() # 平均值
std_x = Titanic['Age'].std() # 标准差
x = np.arange(Titanic['Age'].min(), Titanic['Age'].max()+10, 1)
y = normfun(x, mean_x, std_x)
plt.figure(figsize=(10, 5)) # 创建画布可以设置大小
plt.hist(x=Titanic['Age'],
range=hist_range,
bins=n_bins, # 柱个数
edgecolor='red',
density=True) # 频数还是频率
plt.plot(x, y, color='g', lw=3, label='正态分布图')
Titanic['Age'].plot(kind='kde',color='red',xlim=[0,90],label='核密度图')
plt.set_xticks(range(0, 181, 15))
plt.set_title('Casual')
plt.set_ylabel('Count')
plt.tight_layout()
plt.show()
# seaborn直方图
# 可直接画直方图和核密度图
import numpy as np
import pandas as pd
import seaborn as sns
# 数据准备
a = np.random.randn(100)
s = pd.Series(a)
# 用Seaborn画直方图
sns.distplot(s, kde=True)
plt.show()
散点图
plt.figure(figsize=(10,8)) # 常用大小
plt.scatter(x,y,
s=, # 散点大小
c=,# 散点颜色
marker=, # 散点形状
alpha=, # 散点透明度
linewidths=, # 散点边界线宽度
edgecolors=) # 散点边界线颜色
plt.scatter(x,y,s=10,color='steelblue')
plt.xlabel('xlabel')
plt.ylabel('ylabel')
plt.title('title')
plt.show()
# 需要把同一列不同组的值在散点图上分开体现,可以用循环
color_lst = ['steelblue','indianred','green']
species_lst = ['setosa','versicolor','virginica']
marker_lst = ['x','o','s']
for i in range(0,3):
plt.scatter(x=df.width[df['species']==species_lst[i]],
y=df.length[df['species']==species_lst[i]],
color=color_lst[i],
marker=marker_lst[i],
label=species_lst[i])
plt.legend(loc='best')
plt.xlabel('xlabel',fontsize=12,labelpad=20)
plt.ylabel('ylabel',,fontsize=12,labelpad=20)
plt.title('title')
plt.show()
# seaborn散点图
import numpy as np
import pandas as pd
import seaborn as sns
# 数据准备
N = 1000
x = np.random.randn(N)
y = np.random.randn(N)
# 用Seaborn画散点图
df = pd.DataFrame({'x': x, 'y': y})
sns.jointplot(x="x", y="y", data=df, kind='scatter');
plt.show()
# 散点图呈正方形,且上和右为x和y的分布图
箱线图
plt.boxplot(x,
width:宽度
labels:x轴标签
patch_artist:是否填充箱体颜色
meanline:是否显示均值线
showmeans:是否显示均值
Meanprops:设置均值属性 字典
medianprops:设置中位数属性 字典
showfliers:是否显示异常值
flierprops: 异常值的属性 字典
boxprops:设置箱体属性 字典
capprops:设置箱体末端和顶端线条属性 字典)
plt.figure(figsize=(16,9))
plt.boxplot(x,patch_artist=True,showmeans=True,showfliers=True,
boxprops={'color':'black','facecolor':'steelblue'},
flierprops={'marker':'o','markerfacecolor':'red','markersize'=5},
meanprops={'marker':'D','markerfacecolor':'indianred','markersize'=4},
medianprops={'color':'orange','linestyle':'--'})
plt.title('title')
plt.show()
# seaborn箱线图
import matplotlib.pyplot as plt
import seaborn as sns
# 数据准备
# 生成0-1之间的10*4维度数据
data=np.random.normal(size=(10,4))
lables = ['A','B','C','D']
# 用Matplotlib画箱线图
plt.boxplot(data,labels=lables)
plt.show()
# 用Seaborn画箱线图
df = pd.DataFrame(data, columns=lables)
sns.boxplot(data=df)
plt.show()
热图
import matplotlib.pyplot as plt
import seaborn as sns
# 数据准备
flights = sns.load_dataset("flights") # 自带数据集
data=flights.pivot('year','month','passengers')
# 用Seaborn画热力图
sns.heatmap(data)
plt.show()
雷达图
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
# 数据准备
labels=np.array([u"推进","KDA",u"生存",u"团战",u"发育",u"输出"])
stats=[83, 61, 95, 67, 76, 88]
# 画图数据准备,角度、状态值
angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False)
stats=np.concatenate((stats,[stats[0]]))
angles=np.concatenate((angles,[angles[0]]))
# 用Matplotlib画蜘蛛图
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
ax.plot(angles, stats, 'o-', linewidth=2)
ax.fill(angles, stats, alpha=0.25)
# 设置字体
font = FontProperties(size=14) # 设置字体大小
ax.set_thetagrids(angles * 180/np.pi, labels, FontProperties=font)
plt.show()
Seaborn图和多变量
# 二元变量
import seaborn as sns
# 数据准备
tips = sns.load_dataset("tips")
print(tips.head(10))
# 用Seaborn画二元变量分布图(散点图,核密度图,Hexbin图)
sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter')
sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde')
sns.jointplot(x="total_bill", y="tip", data=tips, kind='hex') # 直方图的二维模拟
plt.show()
# 多个成对双变量
import matplotlib.pyplot as plt
import seaborn as sns
# 数据准备
iris = sns.load_dataset('iris')
# 用Seaborn画成对关系
sns.pairplot(iris)
plt.show()
网友评论