-局部与整体

Posted IT从业者张某某

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了-局部与整体相关的知识,希望对你有一定的参考价值。

文章目录

数据可视化第二版-03部分-07章-局部与整体

光荣的三八节到了,来个充满理想年代的图片。

总结

本系列博客为基于《数据可视化第二版》一书的教学资源博客。本文主要是第07章-局部与整体可视化的案例相关。

可视化视角-局部与整体

代码实现

韦恩图

可参考:https://www.jb51.net/article/238729.htm
https://pypi.org/project/matplotlib-venn/
python中Matplotlib并没有现成的函数可直接绘制venn图, 不过已经有前辈基于matplotlib.patches及matplotlib.path开发了两个轮子。
安装matplotlib_venn:

pip install matplotlib_venn -i https://pypi.tuna.tsinghua.edu.cn/simple

该包提供了四个主要函数:venn2、venn2_circles、venn3和venn3_circles。

venn3

韦恩图1


from matplotlib import pyplot as plt
from matplotlib_venn import venn3

# 1
plt.figure(figsize=(4, 4))  # 设置画布大小
plt.title("韦恩图示例")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
# (Abc, aBc, ABc, abC, AbC, aBC, ABC)
v = venn3(subsets=(20, 10, 5, 15, 5, 10, 5),
          set_labels=('逻辑学', '艺术修养', '大学语文'),
          set_colors=('magenta', 'cyan', 'b'))
plt.show()

输出为:

from matplotlib import pyplot as plt
from matplotlib_venn import venn3

# 2
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

plt.figure(figsize=(4, 4))  # 设置画布大小
v = venn3(subsets=(20, 10, 5, 15, 5, 10, 5), set_labels=('逻辑学', '艺术修养', '大学语文'), set_colors=('magenta', 'cyan', 'b'))
plt.show()

venn2

#导入依赖packages
import matplotlib.pyplot as plt
from matplotlib_venn import venn2,venn2_circles
 
 
# subsets参数
#绘图数据的格式,以下5种方式均可以,注意异同
# (Ab, aB, AB) 
subset = [[1,2,3,1,2,4],#列表list(集合1,集合2)
          (1,2,3,1,2,4),#元组tuple(集合1,集合2)
          '10': 1, '01': 1, '11': 2,#字典dict(A独有,B独有,AB共有)
          (3, 3, 2),####元组tuple(A有,B有,AB共有),注意和其它几种方式的异同点
          [3,3,2]#列表list(A有,B有,AB共有)           
         ]
for i in subset:
    my_dpi=100
    plt.figure(figsize=(500/my_dpi, 500/my_dpi), dpi=my_dpi) # #控制图尺寸的同时,使图高分辨率(高清)显示
    g=venn2(subsets=i, #默认数据绘制venn图,只需传入绘图数据
        set_colors=("#098154","#c72e29"),#设置圈的颜色,中间颜色不能修改
        alpha=0.6,#透明度
        normalize_to=1.0,#venn图占据figure的比例,1.0为占满
        )
    g=venn2_circles(subsets = i, 
        linestyle='--', linewidth=0.8, color="black"#外框线型、线宽、颜色
       )
    plt.title('subsets=%s'%str(i))
    plt.show()




饼图

plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1,
 startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, 
 rotatelabels=False, *, normalize=None, data=None)

x即每个扇形的占比的序列或数组
explode如果不是None,则是一个len(x)长度的数组,指定每一块的突出程度;突出显示,设置每一块分割出来的间隙大小
labels为每个扇形提供标签的字符串序列
colors为每个扇形提供颜色的字符串序列
autopct如果它是一个格式字符串,标签将是fmt % pct。如果它是一个函数,它将被调用。
shadow阴影
startangle从x轴逆时针旋转,饼的旋转角度
pctdistance, default: 0.6每个饼片的中心与由autopct生成的文本的开头之间距离与半径的比率,大于1的话会显示在圆外
labeldistance, default: 1.1饼状图标签绘制时的径向距离(我认为这个也与8类似是个比率)。如果设置为None,则不绘制标签,而是存储在图例()中使用。

# -*- coding:UTF-8 -*-

from matplotlib import pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams["axes.unicode_minus"] = False  # 用来正常显示负号

# 1
labels = '法语', '意大利语', '德语'  # 建立不同类别
sizes = [60, 40, 30]  # 不同类别对应的数量

fig = plt.figure(figsize=(4, 4))
ax1 = fig.add_subplot(111)
color = ['tomato', 'Gold', 'DeepSkyBlue']
ax1.pie(sizes,
        labels=labels,
        labeldistance=0.5,
        colors=color,
        textprops=dict(color='black'),  # 字体颜色
        autopct='%1.1f%%',  # 显示数值标签
        pctdistance=0.7)  # 数值标签到中心点的距离
ax1.axis('equal')
plt.title('小语种学习人数饼图')
plt.show()

from matplotlib import pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams["axes.unicode_minus"] = False  # 用来正常显示负号

# 2
labels = 'Python组', 'Java组', 'C组', 'Go组'
sizes = [25, 45, 30, 10]
fig = plt.figure(figsize=(4, 4))
explode = (0.1, 0, 0, 0) # 分割扇形
ax2 = fig.add_subplot(111)
ax2.pie(sizes, explode=explode,  # 分隔扇形
        labels=labels, autopct='%1.1f%%')
plt.title('不同种类程序语言使用分割饼图')
plt.show()

from matplotlib import pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams["axes.unicode_minus"] = False  # 用来正常显示负号

# 3
labels = '男性', '女性'  # 建立不同类别
sizes = [30, 70]  # 不同类别对应的数量

fig = plt.figure(figsize=(4, 4))
ax1 = fig.add_subplot(111)
color = ['RoyalBlue', 'DeepPink']
ax1.pie(sizes,
        labels=labels,
        labeldistance=0.5,
        colors=color,
        textprops=dict(color='white'),  # 字体颜色
        autopct='%1.1f%%',  # 显示数值标签
        pctdistance=0.7)  # 数值标签到中心点的距离
ax1.axis('equal')
plt.title('某款应用程序使用者性别饼图')
plt.show()

环形图

参考:
[python] 基于matplotlib实现圆环图的绘制
可以重点看下这个链接。

wedgeprops中通过width参数设定内部圆的半径,edgecolor设置内部圆的颜色。

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams["axes.unicode_minus"] = False  # 用来正常显示负号

# 1
labels = ['四川', '河北', '北京', '重庆', '天津']  # 设定类别
A1 = [36980.22, 35964.00, 28000.40, 19500.00, 18595.38]
color = ['yellow', 'cyan', 'lightblue', 'lightgreen', 'pink']
wedges1, texts1, autotexts1 = plt.pie(A1, autopct='%3.1f%%', radius=1, pctdistance=0.8,
                                      colors=color, startangle=180, textprops=dict(color='black'),
                                      wedgeprops=dict(width=0.4, edgecolor='w'))
plt.legend(wedges1, labels, fontsize=12, title='地区', loc='center right',
           bbox_to_anchor=(1, 0, 0.3, 1))
plt.title('2017年四个地区生产总值')
plt.show()

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams["axes.unicode_minus"] = False  # 用来正常显示负号

# 2
labels = ['日用品', '餐饮', '交通', '储蓄', '其他']  # 设定类别
A1 = [1000, 1500, 500, 2000, 1000]
color = ['lightpink', 'hotpink', 'MediumPurple', 'Lavender', 'seashell']
wedges1, texts1, autotexts1 = plt.pie(A1, autopct='%3.1f%%', radius=1, pctdistance=0.8,
                                      colors=color, startangle=180, textprops=dict(color='black'),
                                      wedgeprops=dict(width=0.4, edgecolor='w'))
plt.legend(wedges1, labels, fontsize=12, title='消费种类', loc='center right',
           bbox_to_anchor=(1.1, 0, 0.3, 1))
plt.title('个人消费环形图')
plt.show()

旭日图

参考:
https://pyecharts.org/#/zh-cn/intro
https://pyecharts.org/#/zh-cn/basic_charts?id=sunburst%ef%bc%9a%e6%97%ad%e6%97%a5%e5%9b%be

from pyecharts.charts import Sunburst
from pyecharts import options as opts

data = [
    opts.SunburstItem(
        name="A公司",
        children=[
            opts.SunburstItem(
                name="男装",
                value=15,
                children=[
                    opts.SunburstItem(name="上装", value=8),
                    opts.SunburstItem(name="下装", value=7)]
            ),
            opts.SunburstItem(
                name="女装",
                value=10,
                children=[
                    opts.SunburstItem(name="衬衫", value=5),
                    opts.SunburstItem(name="裙子", value=1),
                    opts.SunburstItem(name="裤子", value=4),
                ],
            ),
        ],
    ),
    opts.SunburstItem(
        name="B公司",
        children=[
            opts.SunburstItem(name="鞋子",
                              children=[
                                  opts.SunburstItem(name="凉鞋", value=1),
                                  opts.SunburstItem(name="运动鞋", value=2),
                              ],
                              )
        ],
    ),

]

sunburst = (
    Sunburst(init_opts=opts.InitOpts(width="600px", height="600px"))
        .add(series_name="", data_pair=data, radius=[0, "90%"])
        .set_global_opts(title_opts=opts.TitleOpts(title="旭日图示例"))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="b"))
        .render("旭日图.html")
)

import os
os.system("旭日图.html")

园堆积图

参考:https://blog.csdn.net/LuohenYJ/article/details/119006870

pip install circlify==0.15.0 

代码:

# 圆堆积图
import circlify
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams["axes.unicode_minus"] = False  # 用来正常显示负号

data = ['id': '中国', 'datum': 1015986, 'children': [
    'id': "广东", 'datum': 110760.94,
     'children': [
         'id': "深圳", 'datum': 27670.24,
         'id': "广州", 'datum': 25019.11
     ],
    'id': "上海", 'datum': 38700.58,
    'id': "北京", 'datum': 36102.6,
    'id': "重庆", 'datum': 25002.79,
    'id': "浙江", 'datum': 64613,
     'children': [
         'id': "杭州", 'datum': 16106,
         'id': "宁波", 'datum': 12408.7,
         'id': "温州", 'datum': 6870.9
     ]
]]

# 计算圆圈位置
circles = circlify.circlify(
    data,
    show_enclosure=False,
    target_enclosure=circlify.Circle(x=0, y=0, r=1)
)

# 设置画布
fig, ax = plt.subplots(figsize=(4, 4))

# 设置标题
ax.set_title('2020年中国部分地市GDP')
ax.axis('off')

lim = max(
    max(
        abs(circle.x) + circle.r,
        abs(circle.y) + circle.r,
    )
    for circle in circles
)
plt.xlim(-lim, lim)
plt

题海,原理,局部,整体——机械与思考

研究生的最后一门考试的科目已经画上了句号,考的是矩阵论。

人生有大大小小、形形色色、各种各样的考试,这或许只是其中微不足道的一部分。

但,自尊,已经被深深刺痛

本科啃课本或许能啃出好成绩,但啃不出思维的变化,啃不出思考的方式。

自己俨然变成了机器人,没有思考,亦步亦趋,人云亦云。

思考在哪里?机械的思考?

不是我想要的

绝不是

机械的方式绝不是创造力提升的方法,包括机械的思维。

就如同机械的刷矩阵论的题目,没有从原理上真正弄懂,结果只是自欺欺人

但,我始终相信,一份付出,一份收获

只不过,方向是首位的考虑因素,思考、批判才是进步的基础。

机械的努力绝不是努力

就像题海一样的刷题获取能刷出一个好成绩,但刷不出自己对原理深刻的理解一样。

每天自己仿佛立下许多flag,但是每天继续浑浑噩噩的过。

每天自己都有提高?

自己凭什么骄傲?

定太多目标反而不如精而专一

每天早睡早起,看似很简单,确实非常难做的事情。

包括学好英语

自己明知道需要改变,却不做出改变,每天自己在原地踏步。

踏不出安逸圈、舒适圈。

自欺欺人罢了。

知行合一还远得很。

知道做不到等于不知道。

不思考,不改变,不精而专,难以在一个领域做的极致。

盲目的、机械的、麻木的、貌似努力的度过每一天,毫无意义,浪费生命

蜕变的过程固然是很痛苦的

但,化蝶从未容易。

今日,1月10日。

2019年的第十个日子。

自己今年23岁,正当精力最充沛的时候。

做一个思考的人

坚持心中的正念。

痛并快乐着吧!

改变,从现在开始,从睁眼的那一刻开始!

以上是关于-局部与整体的主要内容,如果未能解决你的问题,请参考以下文章

Python数据可视化:局部整体图表可视化(基础篇—6)

python+matplotlib+web.py

数据可视化-py

Data Visual一文搞懂matplotlib数据可视化

python使用matplotlib可视化线图(line plot)并为可视化图像添加图例(legend)信息(add legend to matplotlib plot)

数据可视化之matplotlib画图