数据可视化--头歌数据挖掘实训
第1关:单个属性观测值分布——直方图
#导入相关库
import matplotlib
matplotlib.use("Agg")#控制绘图不显示
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
#导入鸢尾花的数据集,并转化成pandas的形式
from sklearn import datasets
iris = datasets.load_iris()
data = pd.DataFrame(iris.data,columns = iris.feature_names)
#选取鸢尾花数据里的 petal width (cm)列进行绘图
x = np.array(data['petal width (cm)'])
########## Begin ##########
plt.hist(x,bins=15,color='pink',histtype='stepfilled',alpha=1)
plt.title('Petal Width')
plt.show()
########## End ##########
plt.title('sepal width')
plt.savefig('/data/workspace/myshixun/step1/image1/T1.png')
第2关:单个属性观测值分布——盒状图
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from sklearn import datasets
import numpy as np
import pandas as pd
iris = datasets.load_iris()
data = pd.DataFrame(iris.data, columns=iris.feature_names)
# 选取出鸢尾花数据集的每列数据,并转化为一个列表list1
x = np.array(data['sepal length (cm)'])
y = np.array(data['sepal width (cm)'])
z = np.array(data['petal length (cm)'])
w = np.array(data['petal width (cm)'])
plt.boxplot(x=[x, y, z, w],
labels=['sepal length', 'sepal width', 'petal length', 'petal width'],
showmeans=True,
patch_artist=True,
boxprops={'color': 'yellow', 'facecolor': 'pink'},
flierprops={'marker': 'D', 'markerfacecolor': 'red', 'color': 'red'},
meanprops={'marker': 'D', 'markerfacecolor': 'black'},
medianprops={'linestyle': '--', 'color': 'green'})
# 显示图形
plt.ylabel('Value (centimeters)')
plt.savefig('/data/workspace/myshixun/step2/image1/T1.png')
第3关:单个属性观测值分布——饼图
法1:(标注了具体的颜色)
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
iris = load_iris()
# target是一个数组,存储了data数据中每条记录属于哪一类鸢尾花,所以数组长度150。
# 数组元素的值共有3个(0,1,2),所以共有三种鸢尾花。(标记名)种类为山鸢尾,杂色鸢尾,维吉尼亚鸢尾。
targets = iris.target
print("标记名:",iris.target_names)
print("标记值:",targets)
dict = {}
for i in targets:
if i not in dict:
dict[i] = 1
else:
dict[i] += 1
print(dict)
value = list(dict.values())
def plot():
plt.figure(figsize=(5,5),dpi=80)
########## Begin ############
# label标签:["Setosa", "Versicolour", "Virginica"]
# 标签
labels =['Setosa','Versicolour','Virginica']
# 数据
values = [1, 1, 1]
# 颜色
#colors = ['blue', 'orange', 'green']
colors = ['#1f77b4', '#ff7f0e', '#2ca02c']
# 突出部分及距离
explode = [0, 0, 0]
# 绘制饼图,其中设置百分比,摆放角度,阴影效果
plt.pie(values, labels=labels, explode=explode, colors = colors,startangle=0, shadow=False,counterclock=True)
# 图例,位置左上角
plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))
# 使用pie函数绘制饼图,其中x=value
# 设置图例位置为左上角
########## End ############
# 标题:"Species"
plt.title('Species')
# 保存图片
plt.savefig('/data/workspace/myshixun/step3/image2/pie.png')
plt.close()
法2: 默认颜色
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
iris = load_iris()
# target是一个数组,存储了data数据中每条记录属于哪一类鸢尾花,所以数组长度150。
# 数组元素的值共有3个(0,1,2),所以共有三种鸢尾花。(标记名)种类为山鸢尾,杂色鸢尾,维吉尼亚鸢尾。
targets = iris.target
print("标记名:",iris.target_names)
print("标记值:",targets)
dict = {}
for i in targets:
if i not in dict:
dict[i] = 1
else:
dict[i] += 1
print(dict)
value = list(dict.values())
def plot():
plt.figure(figsize=(5,5),dpi=80)
########## Begin ############
# label标签:["Setosa", "Versicolour", "Virginica"]
# 标签
labels =['Setosa','Versicolour','Virginica']
# 数据
values = [1, 1, 1]
# 颜色
#colors = ['blue', 'orange', 'green']
# 突出部分及距离
explode = [0, 0, 0]
# 绘制饼图,其中设置百分比,摆放角度,阴影效果
plt.pie(values, labels=labels, explode=explode, startangle=0, shadow=False,counterclock=True)
# 图例,位置左上角
plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))
# 使用pie函数绘制饼图,其中x=value
# 设置图例位置为左上角
########## End ############
# 标题:"Species"
plt.title('Species')
# 保存图片
plt.savefig('/data/workspace/myshixun/step3/image2/pie.png')
plt.close()
第4关:两个属性之间的关系——散布图
(author:强子@真我一个-CSDN博客)
import matplotlib
matplotlib.use('Agg')
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import pandas as pd
import matplotlib.pyplot as plt
iris_dataset = load_iris()
# data 中共150条数据,采集了每个样本的4个特征
# 查看数据集的特征名称,sepal花萼的长宽,petal花瓣的长宽
print("特征名:\n", iris_dataset['feature_names'])
# 查看前5条数据
print("前五条数据:\n{}".format(iris_dataset['data'][:5]))
# 数据集拆分
iris_dataset = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'],
iris_dataset['target'],
random_state=2)
iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names)
def plot():
######### Begin ##########
# 绘制散点矩阵图
pd.plotting.scatter_matrix(iris_dataframe, c=y_train, figsize=(15, 15), marker='o', hist_kwds={'bins': 20}, s=60, alpha=0.8)
######### End ##########
# 保存图片
plt.savefig('/data/workspace/myshixun/step4/image2/scatter_matrix.png')
plt.close()
第5关:时间空间数据的可视化——等高线图
import matplotlib as mpl
# linux终端下没有GUI,进行设置
mpl.use('Agg')
from netCDF4 import Dataset
import matplotlib.pyplot as plt
import numpy as np
nc_obj = Dataset('step5/ERsst.mnmean.nc')
########## Begin ##########
# 获取 1970 年的全球海温数据
temperature = nc_obj
temperature = temperature.variables['sst'][1970,:,:]
########## End ##########
lat, lon = temperature.shape
# 生成网格点坐标矩阵
X, Y = np.meshgrid(range(lon), range(lat))
# 添加画布,画布尺寸宽为 10,长为 5
plt.figure(figsize=(10, 5))
########## Begin ##########
# 传入海温数据绘制热力图,cmap 参数选择 coolwarm
plt.imshow(temperature, cmap='coolwarm')
########## End ##########
# 绘制色彩子图
x = plt.colorbar()
########## Begin ##########
# 设置子图标签,为 Temperature
x.set_label('Temperature')
########## End ##########
########## Begin ##########
# 画出 7 条线,并将颜色设置为红色
contour = plt.contour(X, Y, temperature,7, colors='r')
########## End ##########
# 等高线上标明z(即高度)的值,字体大小是7,颜色分别是红色
plt.clabel(contour, fontsize=7, colors='r')
# 保存图像
plt.savefig('step5/image1/test.png')
第6关:时间空间数据的可视化——曲面图
import matplotlib as mpl
# linux终端下没有GUI,进行设置
mpl.use('Agg')
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # 绘制3D图形
message = np.load('step6/message.npy')
########## Begin ##########
# 根据数据简介获取相应数据
x = message[:80,:]
y = message[80:160,:]
z = message[160:,:]
########## End ##########
########## Begin ##########
# 统一设置图中字体大小为 20
plt.rcParams.update({'font.size':20})
# 设置图像大小为 (10,8)和分辨为 50
fig = plt.figure(figsize=(10,8), dpi=50)
########## End ##########
ax3d = Axes3D(fig) # 将图像转换为 3D 模式
########## Begin ##########
# 构建坐标系,传入数据,绘制曲面图,颜色选用 rainbow
ax3d.plot_surface(x,y,z,cmap='rainbow')
########## End ##########
plt.xlabel('x', labelpad=10) # X轴名称
plt.ylabel('y', labelpad=10) # Y轴名称
ax3d.set_zlabel('z', labelpad=10) # Z轴名称
########## Begin ##########
# 保存图片,路径为:step6/image1/surface_diagram.png
plt.savefig("step6/image1/surface_diagram.png")
########## End ##########
第7关:时间空间数据的可视化——GIS可视化
import matplotlib as mpl
# linux终端下没有GUI,进行设置
mpl.use('Agg')
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
names = []
pops = []
lats = []
lons = []
countries = []
with open('step7/major_city') as f:
text = f.read().split('\n')
for line in text:
info = line.split()
names.append(info[0])
pops.append(float(info[1]))
lat = float(info[2][:-1])
if info[2][-1] == 'S': lat = -lat
lats.append(lat)
lon = float(info[3][:-1])
if info[3][-1] == 'W': lon = -lon + 360.0
lons.append(lon)
country = info[4]
countries.append(country)
# ============================================
########## Begin ##########
# 设置投影模式,初始经纬度, 纬度为 10,经度为 100
map = Basemap(projection='ortho', lat_0=10, lon_0=100)
########## End ##########
# 画海岸线,国家边界,设置边界线条的粗细
map.drawcoastlines(linewidth=0.25)
map.drawcountries(linewidth=0.25)
########## Begin ##########
# 海洋湖泊颜色为 #0099CC,陆地颜色为 #663300,经纬线间隔 10 度
# 绘制地图投影区域的边缘(海洋的颜色)
map.drawmapboundary(fill_color='#0099CC')
# 画出经纬线
map.drawmeridians(np.arange(0,360,10))
map.drawparallels(np.arange(-90,90,10))
# 绘制颜色,zorder 为设置层级,本次是置于最低层
map.fillcontinents(color='#663300', lake_color='#0099CC', zorder=0)
########## End ##########
# 计算出地图投影坐标的纬度/经线网格
x, y = map(lons, lats)
max_pop = max(pops)
# 尺寸比例
size_factor = 80.0
# 字体显示角度
rotation = 30
for i, j, k, name in zip(x, y, pops, names):
# 按比例计算人口显示的散点大小
size = size_factor * k / max_pop
########## Begin ##########
# 根据人口绘制地区散点图,颜色设置为 #FF5600
cs = map.scatter(i, j, s=size,marker='o',color='#FF5600')
########## End ##########
plt.text(i, j, name, rotation=rotation, fontsize=10)
plt.title('Some cities in the eastern hemisphere & Population')
plt.savefig('step7/image1/test.png')
第8关:可视化高维度数据——数据矩阵
(author: sunny@ sdfghshvxbs的博客_CSDN博客)
import matplotlib as mpl
# linux终端下没有GUI,进行设置
mpl.use('Agg')
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 加载数据集
iris = pd.read_csv('step8/iris.csv')
# 查看iris数据集的描述性统计信息
########## Begin ##########
iris.describe()
print(iris.describe())
########## End ##########
# 创建画布
plt.figure(figsize=(7, 5))
# 删除species
species = iris.pop("species")
########## Begin ##########
# 将列数据进行标准化
# 使用clustermap方法对标准化的数据绘制数据矩阵图,standard_scale参数为1
sns.clustermap(iris,standard_scale=1)
########## End ##########
# 保存数据矩阵图
plt.savefig('step8/stu_img/dss.png')
第9关:可视化高维度数据——相关矩阵
(author: sunny@ sdfghshvxbs的博客_CSDN博客)
# -*- coding: utf-8 -*-
import matplotlib as mpl
# linux终端下没有GUI,进行设置
mpl.use('Agg')
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
def GatherClassRanges(data, classranges):
"""数据预处理"""
classes = data.iloc[:, 4].values
length = data.iloc[:, 4].size
classranges.append(0)
flowertype = classes[0]
for count in range(length):
if flowertype != classes[count]:
classranges.append(count)
flowertype = classes[count]
classranges.append(length)
return
def GenerateDataMatrix(data, p):
"""创建矩阵"""
# 将行分隔成不同的类
global title
classes = data.iloc[:, 4].values
classranges = []
GatherClassRanges(data, classranges)
# 获取不包括类名的属性名
headers = list(data)
headers.pop()
# 获取列数
numcol = len(data)
# 每一种花
# 生成一个矩阵初始化为零
matrix = pd.DataFrame(np.zeros((numcol, numcol)))
# 矩阵填充
for i in range(numcol):
for j in range(numcol):
x = data.iloc[i, 0:3].values
y = data.iloc[j, 0:3].values
# 矩阵填充相关性值,这里闵可夫斯基距离的p设定为2
matrix[i][j] = minkowskiDist(x, y, p)
title = 'IrisDataset correlation Matrix'
# 绘制
PlotDistMatrix(matrix, title)
return matrix
def PlotDistMatrix(matrix, title):
"""绘制相关性矩阵"""
with sns.axes_style("white"):
plt.figure()
# 绘制相关性矩阵,cmap为YlGnBu
########## Begin ##########
plot = sns.heatmap(matrix,cmap='YlGnBu')
########## end ##########
plot.set_title(title)
plt.savefig('step9/stu_img/correlation.png')
return
def minkowskiDist(x, y, p):
"""闵可夫斯基距离"""
# 根据左侧公式实现闵可夫斯基距离函数
########## Begin ##########
distance = 0
for i in range(len(x)):
distance += abs(x[i] - y[i]) ** p
distance = distance ** (1/p)
return distance
########## Begin ##########
# 导入数据集
data = pd.read_csv('step9/iris.csv')
GenerateDataMatrix(data, 2)
# -*- coding: utf-8 -*-
import matplotlib as mpl
# linux终端
第10关:可视化高维度数据——平行坐标系
(author: sunny@ sdfghshvxbs的博客_CSDN博客)
import matplotlib as mpl
# linux终端下没有GUI,进行设置
mpl.use('Agg')
from matplotlib import pyplot as plt
import pandas as pd
import seaborn as sns
from pandas.plotting import parallel_coordinates
# 导入鸢尾花数据集
data = pd.read_csv("step10/iris.csv")
########## Begin ##########
# 对数据进行重新定序,['sepal_width', 'sepal_length', 'petal_length', 'petal_width', 'species']
data = data[['sepal_width', 'sepal_length', 'petal_length', 'petal_width', 'species']]
########## End ##########
# 绘制子图
fig, axes = plt.subplots()
# 分类标签
labels = ['setosa', 'versicolor', 'virginica']
# 绘制平行坐标系,class_column为数据所属类别,axes为Matplotlib轴对象,颜色为红绿蓝。
########## Begin ##########
parallel_coordinates(data, 'species', color=['b', 'g', 'r'], ax=axes)
########## End ##########
# 保存图片
fig.savefig('step10/stu_img/parallel.png')