[Python绘图小课堂]分类散点图(自定义类别与颜色)绘制

数据说明

在进行具体的数据分析前,我们会绘制一些可视化图像进行初步分析。比如,对于各省(直辖市)各月住宅类房地产销售额数据(数据来源为国家统计局):

我们想要看看销售额是否有地区分化的特点,那么就可以绘制分类散点图如下:

其中,第一级包括销售量最高的三个省份:江苏、浙江、广东;第二级包括:安徽、 福建 、山东省、河南、四川;第三级包括北京、 河北、 上海、 江西、 湖北、 湖南、重庆;第四级包括:天津、 山西、 辽宁、 广西壮族自治区、 贵州、 云南、 陕西;第五级包括:内蒙古自治区、 吉林、 黑龙江、 海南、 西藏自治区、 甘肃、 青海、 宁夏回族自治区 、 新疆维吾尔自治区。

当然,我们也可以按照八大经济体等方法进行分类。我们绘图所需要的数据类型为DataFrame,数据格式为:

 表格的最后几列就是我们的分类标签。

绘图部分

下面进入绘图部分。

首先,我们先定义一个color函数,用来设定各类散点颜色:

def color(label):
    global mycolor 
    if label == 1:
        mycolor = '#6A539D'
    if label == 2:
        mycolor ='#E6D7B2'
    if label == 3:
        mycolor = '#99CCCC'
    if label == 4:
        mycolor = '#FFCCCC'
    if label == 5:
        mycolor = '#666633'
    return mycolor

基础的散点图大家应该常画,我们只需要准备好横、纵坐标的数据就可以绘制:

plt.scatter(x, y)

举一反三一下,想要按照自定义类绘制自定义颜色分类散点图,我们只需要画n(分类类别数量)个不同颜色的散点图在同一张图上即可:

import matplotlib.pyplot as plt

#中文显示
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#设置绘图大小及分辨率(增加清晰度)
fig = plt.figure(figsize=(18, 8),dpi=600)
#设置y轴范围
plt.ylim(ymax=25000,ymin=0) 

for i in range(len(data_sale_all)): #按行取出各省数据
    #数据准备
    data_tran = pd.DataFrame(data_sale_all.loc[i])
    label = data_tran[i].values[-1] #用于将多个散点图绘制到同一张上
    mycolor = color(label)
    #使用不同的group需要修改class_num,这里我们按5级进行分类
    class_num = -3  #即从第一行取到第-3行
    x = list(data_tran.index[1:class_num])[::-1]   #[::-1]表示逆序输出,使横坐标日期可以从小到大排列
    y = list(data_tran.values[1:class_num])[::-1]
    #绘图   
    plt.scatter(x, y, c=mycolor, label=label)

这样,我们就可以初步绘制出一个自定义颜色与类别的分类散点图:

 绘图优化

初步绘制的图像不够美观,横坐标存在遮挡,字体、散点大小也不合适,同时没有相应的图例显示具体分类情况,因此,我们需要对上述图像进行美化。具体代码如下:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Patch
from matplotlib.lines import Line2D

#自定义颜色
def color(label):
    global mycolor 
    if label == 1:
        mycolor = '#6A539D'
    if label == 2:
        mycolor ='#E6D7B2'
    if label == 3:
        mycolor = '#99CCCC'
    if label == 4:
        mycolor = '#FFCCCC'
    if label == 5:
        mycolor = '#666633'
    return mycolor

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure(figsize=(18, 8),dpi=600)
fig.patch.set_facecolor('#252C45') #设置背景
ax = plt.axes()
ax.set_facecolor('#252C45')
plt.grid(b=False, color='#A7AAB5',linestyle="solid", linewidth=1,axis='y')  #背景网格
area = np.pi*5**2  #点面积 
plt.ylim(ymax=25000,ymin=0) #y轴范围
#删除四周框线
plt.rcParams['axes.spines.left'] = False
plt.rcParams['axes.spines.right'] = False
plt.rcParams['axes.spines.top'] = False
plt.rcParams['axes.spines.bottom'] = False
for i in range(len(data_sale_all)):
    #数据准备
    data_tran = pd.DataFrame(data_sale_all.loc[i])
    label = data_tran[i].values[-1]
    mycolor = color_4(label)
    x = list(data_tran.index[1:-3])[::-1] 
    y = list(data_tran.values[1:-3])[::-1]
    #绘图
    plt.tick_params(axis='x',colors='white') #设置坐标轴刻度颜色
    plt.tick_params(axis='y',colors='white')    
    plt.scatter(x, y, s=area, c=mycolor, zorder=100,alpha=1, label=label) 
    plt.yticks(range(0,20000,5000),fontsize = 16) 
    plt.xticks(rotation= 60,fontsize = 16)

#绘制图例
legend_elements = [Line2D([0], [0], marker='o', color='#252C45', label='第一级',markerfacecolor=color(1), markersize=14),
                   Line2D([0], [0], marker='o', color='#252C45', label='第二级',markerfacecolor=color(2), markersize=14),
                   Line2D([0], [0], marker='o', color='#252C45', label='第三级',markerfacecolor=color(3), markersize=14),
                   Line2D([0], [0], marker='o', color='#252C45', label='第四级',markerfacecolor=color(4), markersize=14),
                   Line2D([0], [0], marker='o', color='#252C45', label='第五级',markerfacecolor=color(5), markersize=14)]
#fig, ax = plt.subplots()
leg = plt.legend(fontsize = 18,handles=legend_elements,ncol=5,frameon=False, loc='upper center')
for text in leg.get_texts():   #修改图例字体颜色
    plt.setp(text, color = 'w')
plt.show()

版权声明:本文为qq_36516414原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。