当前位置:首页 > 科技  > 软件

一图胜千言!深度掌握 Python 绘图

来源: 责编: 时间:2024-05-29 08:56:34 66观看
导读据可视化是数据科学家传达洞见和讲述数据故事的关键工具。作为 Python 开发者,我们拥有丰富的可视化库和工具,能够创建各种引人入胜的图表。本文将探索一些鲜为人知但实用的可视化类型,如桑基图(Sankey Diagrams)、脊线

据可视化是数据科学家传达洞见和讲述数据故事的关键工具。作为 Python 开发者,我们拥有丰富的可视化库和工具,能够创建各种引人入胜的图表。本文将探索一些鲜为人知但实用的可视化类型,如桑基图(Sankey Diagrams)、脊线图(Ridge Plots)、内嵌图(Insets)、雷达图(Radar Chart)和词云图(Word Cloud Plots)。我们将主要使用流行的 Matplotlib、Seaborn 和 Plotly 这些 Python 库来实现这些有趣的可视化效果,让你的数据讲述更加生动有趣。pm328资讯网——每日最新资讯28at.com

我们将使用形状、大小、颜色、方向、面积和标记符号等属性,为十种不同的使用案例创建绘图。在每个使用案例中,我们的目标都是创建有效、高效和美观的可视化效果。描述这些词语在图表中的含义如下:pm328资讯网——每日最新资讯28at.com

(a) 有效:图表中包含了所有需要传达的信息(b) 高效:图表中没有多余的数据(c) 美观:图表以清晰的方式展示数据,吸引注意力pm328资讯网——每日最新资讯28at.com

所有图表都是二维图,因为从效率和效果的角度来看,二维图比三维图更清晰易懂,同时更容易描绘距离。文中还将介绍每个用例的代码,并讨论代码和图表中的要点。pm328资讯网——每日最新资讯28at.com

用例 1

描述大学之间学生交流流动的桑基图。

这些图展示了资源流动的情况,下面的代码展示了用例的实现。 字符 "A" 代表第一所大学,字符 "B" 代表第二所大学。 数字 3、4、5 分别代表不同的系,即{Statistics, Math, Physics}。第 25 行创建了一个图表,其中 node 和 link是字典。 node 使用的 label 对象由唯一的 Depts 院系组成,而 link 使用的两个列表分别由 sending"院系的索引和 acepting 院系的索引组成。pm328资讯网——每日最新资讯28at.com

import pandas as pdimport plotly.graph_objects as grdata = {    'Sending_Dept':   ['5A', '4A', '5B', '5A', '4B', '4A', '3A', '3B', '3A', '3B', '3A', '3B'],    'Accepting_Dept': ['4B', '5B', '5A', '5B', '4A', '4B', '5B', '5A', '4B', '4A', '3B', '3A'],    'FlowValue': [1, 3, 4, 3, 4, 4, 1, 1, 3, 2, 5, 3]}df = pd.DataFrame(data)unique_departments = set(df['Sending_Dept']).union(set(df['Accepting_Dept']))Depts = list(unique_departments)Dept_indices = {}for i, dept in enumerate(Depts):    Dept_indices[dept] = isending_indices = []for dept in df['Sending_Dept']:    dept_index = Dept_indices[dept]    sending_indices.append(dept_index)    print(f"Sending indices are: {sending_indices}")accepting_indices = []for dept in df['Accepting_Dept']:    dept_index = Dept_indices[dept]    accepting_indices.append(dept_index)flowvalues = df['FlowValue'].tolist()# Sankey diagramfig = gr.Figure(data=[gr.Sankey(    node=dict( pad=10,thickness=25,line=dict(color="red", width=0.8),label=Depts,),    link=dict(source=sending_indices,target=accepting_indices,value=flowvalues    ))])fig.update_layout(title_text="Sankey Diagram of exchange students flow between University Depts", font_size=12)fig.show()

生成的"桑基图"图(1)中,节点3A旁的橙色矩形显示了光标放置在节点上时的情况。当光标位于节点"3A"上时,我们可以看到A大学3系接受和派遣交换生的频率。它接受学生1次,派遣学生3次。我们还可以从上面代码片段中的 data 字典推断出这一点,因为"3A"在Sending_Dept列表中出现了3次,在Accepting_Dept列表中出现了1次。节点 "3A" 左边的数字9是它向B大学派出的交换生总数。我们还可以通过在Sending_Dept列表中添加与3A相对应的FlowValues来推断。pm328资讯网——每日最新资讯28at.com

我们还注意到,当我们点击节点 "3A" 时,从它发出的箭头会变暗,并显示出与 "3A" 交换学生的其他节点。箭头的粗细与 FlowValues 相对应。总之,桑基图利用箭头的方向和粗细来传递流动信息,并以文字为基础为每个节点形成累积流动。pm328资讯网——每日最新资讯28at.com

图 1. 桑基图显示了两所大学各系之间的学生交流流图 1. 桑基图显示了两所大学各系之间的学生交流流pm328资讯网——每日最新资讯28at.com

用例 2

绘制一家房地产中介公司的房屋销售数据。

一位数据科学家在房地产中介公司工作,机构要求绘制上个月售出房屋信息的二维图。每栋售出的房屋需包含房价、距离市中心、方向、代理佣金和销售代理的公司级别(助理、副总裁、合伙人)的信息。二维图形信息量大,可使用复杂对象描述地块上的每栋房屋。具体来说,使用“笑脸表情符号”实现方法的代码片段如下。pm328资讯网——每日最新资讯28at.com

import matplotlib.pyplot as pltimport numpy as npnp.random.seed(125)num_houses = 10distances = np.random.uniform(0, 30, num_houses)  # distance from city centerprices = np.random.uniform(400, 2000, num_houses) * 1000  # sale price in thousandsdirections = np.random.choice(['N', 'S', 'E', 'W'], num_houses)  # direction from city centeragent_levels = np.random.choice([1, 2, 3], num_houses)  # agent's leveldef get_emoji_size(level):    size_map = {1: 250, 2: 380, 3: 700}    return size_map.get(level, 120)  # Increased size for better visibilitydef get_emoji_color_new(price):    if price < 600000:        return 'white'  # Light yellow for $400k-$600k    elif price < 800000:        return 'yellow'        # White for $600k-$800k    elif price < 1000000:        return 'pink'         # Pink for $800k-$1 million    else:        return 'lime'         # Lime for $1 million-$2 milliondef rotate_smiley(direction):    rotation_map = {'N': 0, 'E': 270, 'S': 180, 'W': 90}    return rotation_map.get(direction, 0)  # default no rotation if direction not foundplt.figure(figsize=(12, 8))for i in range(num_houses):    plt.scatter(distances[i], prices[i], s=get_emoji_size(agent_levels[i]),/    c=get_emoji_color_new(prices[i]),                 marker='o', edgecolors='black', alpha=0.8)    plt.text(distances[i], prices[i], " 
                

本文链接:http://www.28at.com/showinfo-26-91360-0.html一图胜千言!深度掌握 Python 绘图

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python 中 Globals 函数的妙用

下一篇: 每个前端开发人员都应该了解的软件工程原理

标签:
  • 热门焦点
Top