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

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

其中,第一级包括销售量最高的三个省份:江苏、浙江、广东;第二级包括:安徽、 福建 、山东省、河南、四川;第三级包括北京、 河北、 上海、 江西、 湖北、 湖南、重庆;第四级包括:天津、 山西、 辽宁、 广西壮族自治区、 贵州、 云南、 陕西;第五级包括:内蒙古自治区、 吉林、 黑龙江、 海南、 西藏自治区、 甘肃、 青海、 宁夏回族自治区 、 新疆维吾尔自治区。
当然,我们也可以按照八大经济体等方法进行分类。我们绘图所需要的数据类型为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版权协议,转载请附上原文出处链接和本声明。