前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Matplotlib类别比较图(3)

Matplotlib类别比较图(3)

作者头像
python数据可视化之路
发布2023-02-23 21:03:23
9590
发布2023-02-23 21:03:23
举报

本篇继续介绍matpltolib类别比较图的绘制,分别是桑基图和词云图。

1、桑基图

桑基图是展现数据流动的很好工具,是一种特定类型的流量图。在这个图中,指示箭头的宽度与流量大小成比例。

方法1:(黄色表示常用参数)

步骤1:创建sankey实例对象

sankey=Sankey(ax=None,scale=1.0,unit='',format='%G',gap=0.25,radius=0.1,shoulder=0.03,offset=0.15,head_angle=100,margin=0.4,tolerance=1e-06,**kwargs)

ax:桑基图绘制在哪个图中,若不添加此参数,默认新建一个图绘制,例如ax = ax1。(可选参数)

offset:桑基图字体与箭头的间隔,如果离得过近,可适当增加。(可选参数)


步骤2:添加数据流,设置流标签

sankey.add(patchlabel='',flows=None,orientations=None,labels='',trunklength=1.0,pathlengths=0.25,piror=None,connect=(0,0), rotation=0,**kwargs)

patchlabel:桑基图的名称(在中部显示)。(可选参数)

flows:数据流(流入流出)。(必要参数)

oreintations:数据流方向。(必要参数)

labels:每个数据流的名称。(必要参数)

**kwargs:其他设置,例如:color(边框颜色);facecolor(桑基图颜色);alpha(透明度);label(系列标签)。


步骤3:完成桑基图设置

diagrams = sankey.finish()

代码语言:javascript
复制
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
from matplotlib.sankey import Sankey
mpl.rcParams['font.sans-serif'] = ['simsun']
mpl.rcParams['font.size'] = 14
# print(mpl.rcParams.keys())
fig = plt.figure(figsize = (5, 5))
ax1 = fig.add_subplot(111)
#设置数据流(注意,输入总和为1,输出也要为1)
flows = [0.2, 0.1, 0.4, 0.3, -0.6, -0.05, -0.15, -0.2] 
#设置数据流的每个标签
labels = ['理财', '专利', '工资', '兼职', '交通饮食', '旅行', '教育', '运动']
#设置数据流的每个方向:0水平、1向上、-1向下 
orientation = [1, 1, 0, -1, 1, -1, 1, 0]
#设置桑基图绘制在ax1子图中,标签与箭头偏移0.3
sankey = Sankey(ax = ax1, offset = 0.3)
#设置桑基图名称、数据流、箭头颜色和桑基图颜色
sankey.add(patchlabel = '家庭收支', flows = flows, labels = labels, orientations = orientation, color = 'c', fc = 'lightgreen',  
          alpha = .7)
diagram = sankey.finish()
ax1.axis('off') #关闭坐标轴
plt.show()

另外的,我们也可以指定某几个标签的颜色,代码如下:

代码语言:javascript
复制
diagram = sankey.finish()
diagram[0].texts[4].set_color('red') #设置第4个流字体为红色
diagram[0].texts[4].set_weight('bold')#设置第4个流字体加粗
diagram[0].text.set_fontsize(20)#设置桑基图名称字体大小
diagram[0].text.set_weight('bold')

示例2:绘制具有两个系统的桑基图。

代码语言:javascript
复制
fig = plt.figure(figsize = (6, 6))
ax = fig.add_subplot(111)
flows = [0.25, 0.15, 0.60, -0.10, -0.05, -0.25, -0.15, -0.10, -0.35]
sankey = Sankey(ax=ax)
#设置第一个桑基图 
sankey.add(flows=flows, label='one',
           orientations=[-1, 1, 0, 1, 1, 1, -1, -1, 0])
#设置第二个桑基图
sankey.add(flows=[-0.25, 0.15, 0.1], label='two', 
           orientations=[-1, -1, -1], prior=0, connect=(0, 0))
diagrams = sankey.finish()
#设置填充样式
diagrams[-1].patch.set_hatch('/')
ax.axis('off')

语法2:桑基图的另外一种形式(需要安装pycharts库)

概念图来自知乎

语法:

sankey=(Sankey().add(series_name='',nodes=[] ,links=[], ...... ))

series_name:系列名称

nodes:节点列表

links:连接列表

实例:现有一些数据,记录了一个月的主要消费情况,使用桑基图表示消费的类别关系,并反映每个类别的流向特征。

注意:nodes和links的形式:

nodes形式

links形式

完整代码如下:

代码语言:javascript
复制
from pyecharts.charts import Sankey
from pyecharts.charts import Page, Sankey
from pyecharts import options as opts
import pandas as pd

path1 = r"D:\公众号\Pandas基本操作\生活消费.xlsx"
df = pd.read_excel(path1)
#构建nodes
nodes = [{'name': item} for item in df['项目']]
nodes.append({'name': '总支出'})
#按行读取,构建连接,df.iterrows()方法可以按行读取
links = [{'source': row[0], 'target': row[1], 'value': row[2]} for index, row in df.iterrows()]
c = (
        Sankey()
        .add(
            "费用/元",
            nodes,
            links,
            linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source",type_="dotted"),
            label_opts=opts.LabelOpts(position="right",),
        )
        .set_global_opts(title_opts=opts.TitleOpts(title="我的生活支出一览"))
    )
# 输出html可视化结果
c.render(r"C:\Users\Smile\Desktop\桑基图.html")

注:由于笔者并未掌握pycharts图像转图片的语法,读者可以自行探索。

2、词云图

词云图是通过使每个字的大小与其出现的频率成正比,显示不同单词再给定文本中的频率,然后将所有字排在一起,形成云状图案,也可以任意格式排列:水平线、垂直列或其他形状。在词云图中使用颜色通常是毫无意义的,主要是为了美观,我们可以用颜色对单词进行分类或显示另外一个数据变量。通常用于博客中,也可以比较两个不同的文本。

注:在python中绘制词云图,需要安装wordcloud库。

语法(黄色为常用参数):

步骤一:设置词云对象

wc=WordCloud(font_path,width,height,margin,mask,max_words,stopwords,background_color,max_font_size,min_font_size, font_step,colormap)

font_path:字体路径,默认为None,如果文本为英文,不用设置,否则必须要设置字体路径。

width,height:宽度,高度。(可选参数)

mask:图片形状,默认为矩形,如果要修改,需要寻找图片掩膜文件。(可选参数)

max_words:最多的词汇量。

max_font_size,max_font_size:最大字体,最小字体(可选参数)

background_color:背景色。(可选参数)

stopwords:停止词设置,修正词云图时需要设置。(可选参数)

colormap:颜色映射,可更改名称,进而更改整体风格。(可选参数)

matplotlib中支持的颜色映射有:

概念图来自知乎


步骤二:指定词云文件

wc.generate_from_text(text)

text:可以是英语语句或者是中文单词组成的内容。

注意:设置参数font_path时要一定要注意好路径,如果是英文,则不用设置此参数,否则必须指定。一般而言,字体文件在C:\Windows\Fonts下,使用simsun字体即可。

实例:如图,是摘自《卖火柴的小女孩》片段,现在需要绘制出这里面的词云图,以了解哪些词出现的频率高。

代码如下:

代码语言:javascript
复制
import matplotlib.pyplot as plt
import wordcloud
import jieba

fig = plt.figure(figsize = (6, 6))
file = r"D:\公众号\Pandas基本操作\卖火柴小女孩.txt"
with open(file, 'r', encoding = 'utf-8') as f:
    t = f.read() #读取文件
content = t.replace(' ', '') #去除文件的空格
ls = jieba.lcut(content) #利用jieba库对中文文章进行分词 
ls = [i for i in ls if len(i)>2] #提取分词列表中长度大于2个字的词列表
#实例化词云图,设置字体路径,背景色为黑色,最大字号为50,最小字号为4,最多词数为100
w = wordcloud.WordCloud(font_path = r"C:\\Windows\\Fonts\\simsun.ttc", background_color="black", max_font_size = 50, min_font_size = 4, 
                       max_words = 100)
# w.generate_from_text(content)
w.generate_from_text(' '.join(ls))
ax1 = fig.add_subplot(111)
ax1.imshow(w, interpolation = 'bilinear')
ax1.axis('off') #关闭坐标轴 
plt.show()

将colormap改为'jet'的色条后,可以看出主题颜色发生了较大变化:

代码语言:javascript
复制
w = wordcloud.WordCloud(font_path = r"C:\\Windows\\Fonts\\simsun.ttc", background_color="black", max_font_size = 50, min_font_size = 4, 
                       max_words = 100, colormap = 'jet')

colormap为jet风格的词云图

目前笔者关于matplotlib类别比较图的了解到此结束,通过整理也学到许多。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python数据可视化之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云图数据可视化
腾讯云图数据可视化(Tencent Cloud Visualization) 是一站式数据可视化展示平台,旨在帮助用户快速通过可视化图表展示大量数据,低门槛快速打造出专业大屏数据展示。精心预设多种行业模板,极致展示数据魅力。采用拖拽式自由布局,全图形化编辑,快速可视化制作。腾讯云图数据可视化支持多种数据来源配置,支持数据实时同步更新,同时基于 Web 页面渲染,可灵活投屏多种屏幕终端。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档