关于数据的可视化-直方图和二维频次直方图
就像将一维数组分为区间创建一维频次直方图一样,我们也可以将二维
数组按照二维区间进行切分,来创建二维频次直方图。
一维直方图主要用hist来展示,二维的关系可以用散点图、多hist叠加、hist2d或seaborn来展现,seaborn的主要数据类型是pandas,因此需要转换,又复习了一下Numpy转pandas。
代码示例
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import pandas as pd
from sklearn import datasets
# 单变量直方图展示
data = np.random.randn(1000)
plt.hist(data)
plt.show()
# 单变量直方图展示,指定分组数,填充类型,填充色彩,透明度
plt.hist(data, bins=30, density=True, alpha=0.5,histtype='stepfilled', color='steelblue', edgecolor='none')
plt.show()
# 加载sklearn的鸢尾花数据集
iris=datasets.load_iris()
titles=['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
fig=plt.figure(figsize=(8,6) ,dpi=80)
kwargs = dict(histtype='stepfilled', alpha=0.3, density=True, bins=10)
# 分别查看不同类型鸢尾花在四个维度上的直方图
for i in range(4):
ax = fig.add_subplot(2, 2, i+1)
# 分别获取三种鸢尾花,在同一刻度上展示直方图,通过不同颜色和透明度进行叠加展示
type1=iris.data[iris.target==][:,i]
type2=iris.data[iris.target==1][:,i]
type3=iris.data[iris.target==2][:,i]
plt.hist(type1, **kwargs)
plt.hist(type2, **kwargs)
plt.hist(type3, **kwargs)
plt.title(titles[i])
plt.show()
# 构造身高和体重的线性关系数据-随机数据
# 均值为175,方差为15,且正态分布的1000个随机值
height=np.random.normal(175,15,size=1000)
# 构造体重值随机数
weight = (height - 100) * (0.9+np.random.randn(1000)/50) + np.random.randn(1000)*5
# 标准散点图展示
plt.scatter(height,weight)
plt.show()
# plt.hist2d进行二维直方图展示
plt.hist2d(height,weight, bins=30, cmap='Blues')
cb = plt.colorbar()
cb.set_label('counts in bin')
plt.show()
# plt.hexbin进行六边形区间划分
plt.hexbin(height,weight, gridsize=30, cmap='Blues')
cb = plt.colorbar(label='count in bin')
plt.show()
# 使用seaborn画图,需要使用pandas
print(height.shape)
print(weight.shape)
# 意思是一维数组,数组中有1000个元素
# 一维数组可以进行合并,但无法得到2维数组,需要通过np.newaxis增加一个维度,变成2维数组
# (1000,)
# (1000,)
height = height[:,np.newaxis]
weight = weight[:,np.newaxis]
# 意思是一个二维数组,1000行1列
# (1000, 1)
# (1000, 1)
data=np.hstack((height,weight))
print(data.shape)
# 意思是一个二维数组,1000行2列
# (1000, 2)
# 将numpy数组转换为pandas类型
pd = pd.DataFrame(data,columns=['height','weight'])
# seaborn散点图
sns.set(style="white", color_codes=True)
sns.jointplot(x="height",y="weight",data=pd);
plt.show()
# seaborn线性回归图
sns.jointplot(x="height",y="weight",data=pd, kind="reg")
plt.show()
# seaborn六边形区间划分
sns.jointplot(x="height",y="weight",data=pd, kind="hex")
plt.show()
# seaborn核密度图
sns.jointplot(x="height",y="weight",data=pd, kind="kde");
plt.show()
# 两个维度的核密度
f, ax = plt.subplots(figsize=(6, 6))
sns.kdeplot(pd['height'], pd['weight'], ax=ax)
sns.rugplot(pd['height'], color="g", ax=ax)
sns.rugplot(pd['weight'], vertical=True, ax=ax);
plt.show()
# 核密度图,色彩方面更加迷幻一些
f, ax = plt.subplots(figsize=(6, 6))
cmap = sns.cubehelix_palette(as_cmap=True, dark=, light=1, reverse=True)
sns.kdeplot(pd['height'], pd['weight'], cmap=cmap, n_levels=60, shade=True);
plt.show()
# 核密度中增加数据三点
g = sns.jointplot(x="height", y="weight", data=pd, kind="kde", color="r")
g.plot_joint(plt.scatter, c="b", s=30, linewidth=1, marker="+")
g.ax_joint.collections[].set_alpha()
g.set_axis_labels("height", "weight");
plt.show()
相关文章