数据可视化--头歌数据挖掘实训

第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') 

posted @ 2024-03-13 08:26  geekChen01  阅读(0)  评论(0)    收藏  举报  来源