据可视化是数据科学家传达洞见和讲述数据故事的关键工具。作为 Python 开发者,我们拥有丰富的可视化库和工具,能够创建各种引人入胜的图表。本文将探索一些鲜为人知但实用的可视化类型,如桑基图(Sankey Diagrams)、脊线图(Ridge Plots)、内嵌图(Insets)、雷达图(Radar Chart)和词云图(Word Cloud Plots)。我们将主要使用流行的 Matplotlib、Seaborn 和 Plotly 这些 Python 库来实现这些有趣的可视化效果,让你的数据讲述更加生动有趣。
我们将使用形状、大小、颜色、方向、面积和标记符号等属性,为十种不同的使用案例创建绘图。在每个使用案例中,我们的目标都是创建有效、高效和美观的可视化效果。描述这些词语在图表中的含义如下:
(a) 有效:图表中包含了所有需要传达的信息(b) 高效:图表中没有多余的数据(c) 美观:图表以清晰的方式展示数据,吸引注意力
所有图表都是二维图,因为从效率和效果的角度来看,二维图比三维图更清晰易懂,同时更容易描绘距离。文中还将介绍每个用例的代码,并讨论代码和图表中的要点。
这些图展示了资源流动的情况,下面的代码展示了用例的实现。 字符 "A" 代表第一所大学,字符 "B" 代表第二所大学。 数字 3、4、5 分别代表不同的系,即{Statistics, Math, Physics}。第 25 行创建了一个图表,其中 node 和 link是字典。 node 使用的 label 对象由唯一的 Depts 院系组成,而 link 使用的两个列表分别由 sending"院系的索引和 acepting 院系的索引组成。
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来推断。
我们还注意到,当我们点击节点 "3A" 时,从它发出的箭头会变暗,并显示出与 "3A" 交换学生的其他节点。箭头的粗细与 FlowValues 相对应。总之,桑基图利用箭头的方向和粗细来传递流动信息,并以文字为基础为每个节点形成累积流动。
图 1. 桑基图显示了两所大学各系之间的学生交流流
一位数据科学家在房地产中介公司工作,机构要求绘制上个月售出房屋信息的二维图。每栋售出的房屋需包含房价、距离市中心、方向、代理佣金和销售代理的公司级别(助理、副总裁、合伙人)的信息。二维图形信息量大,可使用复杂对象描述地块上的每栋房屋。具体来说,使用“笑脸表情符号”实现方法的代码片段如下。
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
下一篇: 每个前端开发人员都应该了解的软件工程原理