大家好,欢迎来到IT知识分享网。
数据可视化是数学建模比赛中关键的一步。
同学们在以数据可视化表现某些数据时可以尝试使用 Python 的第三方库。
不过有些同学可能会问也会遇到不少问题,比如选择何种图表,以及如何制作,代码如何编写,这些都是问题!
今天给大家介绍几种常见的 Python 数据可视化图表(第一期),总计约 16 个示例~
01. 小提琴图
小提琴图可以将一组或多组数据的数值变量分布可视化。
import seaborn as sns import matplotlib.pyplot as plt # 加载数据 df = sns.load_dataset('iris', data_home='seaborn-data', cache=False) # 绘图显示 sns.violinplot(x=df["species"], y=df["sepal_length"]) plt.show()
02. 核密度估计图
核密度估计图是对直方图的一个拓展。
可以可视化一个或多个组的数值变量的分布,适合大型数据集。
import seaborn as sns import matplotlib.pyplot as plt # 加载数据 df = sns.load_dataset('iris', data_home='seaborn-data', cache=False) # 绘图显示 sns.kdeplot(df['sepal_width']) plt.show()
结果如下:
03. 散点图
散点图,显示两个数值变量之间的关系。
import seaborn as sns import matplotlib.pyplot as plt # 加载数据 df = sns.load_dataset('iris', data_home='seaborn-data', cache=False) # 绘图显示 sns.regplot(x=df["sepal_length"], y=df["sepal_width"]) plt.show()
结果如下:
04. 矩形热力图
矩形热力图,矩阵中的每个值都被表示为一个颜色数据。
import seaborn as sns import pandas as pd import numpy as np # 加载数据 df=pd.DataFrame(np.random.random((5,5)),columns=["a","b","c","d","e"]) # Default heatmap p1 = sns.heatmap(df)
结果如下:
05. 相关性图
分析每对数据变量之间的关系
相关性可视化为散点图,对角线用直方图或密度图表示每个变量的分布。
import seaborn as sns import matplotlib.pyplot as plt # 加载数据 df = sns.load_dataset('iris', data_home='seaborn-data', cache=True) # 绘图显示 sns.pairplot(df) plt.show()
结果如下:
06. 气泡图
气泡图本质是一个散点图,其中圆圈大小被映射到第三数值变量的值。
import matplotlib.pyplot as plt import seaborn as sns from gapminder import gapminder # 导入数据 data = gapminder.loc[gapminder.year == 2007] # 使用 scatterplot 创建气泡图 sns.scatterplot(data=data, x="gdpPercap", y="lifeExp", size="pop", legend=False, sizes=(20, 2000)) # 显示 plt.show()
结果如下:
07. 连接散点图
连接散点图就是一个线图,其中每个数据点由圆形或任何类型的标记展示。
import matplotlib.pyplot as plt import numpy as np import pandas as pd # 创建数据 df = pd.DataFrame({'x_axis': range(1, 10), 'y_axis': np.random.randn(9) * 80 + range(1, 10)}) # 绘制显示 plt.plot('x_axis', 'y_axis', data=df, linestyle='-', marker='o') plt.show()
结果如下:
08. 雷达图
雷达图,可以可视化多个定量变量的一个或多个系列的值。
每个变量都有自己的轴,所有轴都连接在图形的中心。
结果如下:import matplotlib.pyplot as plt import pandas as pd from math import pi # 设置数据 df = pd.DataFrame({ 'group': ['yun', 'ding', 'shu', 'mo'], 'var1': [38, 1.5, 30, 4], 'var2': [29, 10, 9, 34], 'var3': [8, 39, 23, 24], 'var4': [7, 31, 33, 14], 'var5': [28, 15, 32, 14] }) # 目标数量 categories = list(df)[1:] N = len(categories) # 角度 angles = [n / float(N) * 2 * pi for n in range(N)] angles += angles[:1] # 初始化 ax = plt.subplot(111, polar=True) # 设置第一个 ax.set_theta_offset(pi / 2) ax.set_theta_direction(-1) # 添加背景信息 plt.xticks(angles[:-1], categories) ax.set_rlabel_position(0) plt.yticks([10, 20, 30], ["10", "20", "30"], color="grey", size=7) plt.ylim(0, 40) # 添加数据图 # 第一个 values = df.loc[0].drop('group').values.flatten().tolist() values += values[:1] ax.plot(angles, values, linewidth=1, linestyle='solid', label="yun") ax.fill(angles, values, 'b', alpha=0.1) # 第二个 values = df.loc[1].drop('group').values.flatten().tolist() values += values[:1] ax.plot(angles, values, linewidth=1, linestyle='solid', label="ding") ax.fill(angles, values, 'r', alpha=0.1) # 第三个 values = df.loc[2].drop('group').values.flatten().tolist() values += values[:1] ax.plot(angles, values, linewidth=1, linestyle='solid', label="shu") ax.fill(angles, values, 'r', alpha=0.1) # 第四个 values = df.loc[3].drop('group').values.flatten().tolist() values += values[:1] ax.plot(angles, values, linewidth=1, linestyle='solid', label="mo") ax.fill(angles, values, 'r', alpha=0.1) # 添加图例 plt.legend(loc='upper right', bbox_to_anchor=(0.1, 0.1)) # 显示 plt.show()
结果如下:
09. 棒棒糖图
棒棒糖图是柱状图的一种变形,显示一个线段和一个圆。
import matplotlib.pyplot as plt import pandas as pd import numpy as np # 创建数据 df = pd.DataFrame({'group': list(map(chr, range(65, 85))), 'values': np.random.uniform(size=20) }) # 排序取值 ordered_df = df.sort_values(by='values') my_range = range(1, len(df.index)+1) # 创建图表 plt.stem(ordered_df['values']) plt.xticks(my_range, ordered_df['group']) # 显示 plt.show()
结果如下:
10. 径向柱图
径向柱图同样也是条形图的变形,但是使用极坐标而不是直角坐标系。
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 生成数据 df = pd.DataFrame( { 'Name': ['item ' + str(i) for i in list(range(1, 51)) ], 'Value': np.random.randint(low=10, high=100, size=50) }) # 排序 df = df.sort_values(by=['Value']) # 初始化画布 plt.figure(figsize=(20, 10)) ax = plt.subplot(111, polar=True) plt.axis('off') # 设置图表参数 upperLimit = 100 lowerLimit = 30 labelPadding = 4 # 计算最大值 max = df['Value'].max() # 数据下限 10, 上限 100 slope = (max - lowerLimit) / max heights = slope * df.Value + lowerLimit # 计算条形图的宽度 width = 2*np.pi / len(df.index) # 计算角度 indexes = list(range(1, len(df.index)+1)) angles = [element * width for element in indexes] # 绘制条形图 bars = ax.bar( x=angles, height=heights, width=width, bottom=lowerLimit, linewidth=2, edgecolor="white", color="#61a4b2", ) # 添加标签 for bar, angle, height, label in zip(bars,angles, heights, df["Name"]): # 旋转 rotation = np.rad2deg(angle) # 翻转 alignment = "" if angle >= np.pi/2 and angle < 3*np.pi/2: alignment = "right" rotation = rotation + 180 else: alignment = "left" # 最后添加标签 ax.text( x=angle, y=lowerLimit + bar.get_height() + labelPadding, s=label, ha=alignment, va='center', rotation=rotation, rotation_mode="anchor") plt.show()
结果如下:
11. 维恩图
维恩图,显示不同组之间所有可能的关系。
import matplotlib.pyplot as plt from matplotlib_venn import venn2 # 创建图表 venn2(subsets=(10, 5, 2), set_labels=('Group A', 'Group B')) # 显示 plt.show()
12. 饼图
饼图将圆划分成一个个扇形区域,每个区域代表在整体中所占的比例。
import matplotlib.pyplot as plt # 创建数据 size_of_groups = [12, 11, 3, 30] # 生成饼图 plt.pie(size_of_groups) plt.show()
结果如下:
13. 折线图
折线图是最常见的图表类型之一。
将各个数据点标志连接起来的图表,用于展现数据的变化趋势。
import matplotlib.pyplot as plt import numpy as np # 创建数据 values = np.cumsum(np.random.randn(1000, 1)) # 绘制图表 plt.plot(values) plt.show()
结果如下:
14. 堆叠面积图
堆叠面积图表示若干个数值变量的数值演变。
每个显示在彼此的顶部,易于读取总数,但较难准确读取每个的值。
import matplotlib.pyplot as plt # 创建数据 x = range(1, 6) y1 = [1, 4, 6, 8, 9] y2 = [2, 2, 7, 10, 12] y3 = [2, 8, 5, 10, 6] # 生成图表 plt.stackplot(x, y1, y2, y3, labels=['A', 'B', 'C']) plt.legend(loc='upper left') plt.show()
结果如下:
15. 河流图
河流图是一种特殊的流图, 它主要用来表示事件或主题等在一段时间内的变化。
围绕着中心轴显示,且边缘是圆形的,从而形成流动的形状。
import matplotlib.pyplot as plt import numpy as np from scipy import stats # 添加数据 x = np.arange(1990, 2020) y = [np.random.randint(0, 5, size=30) for _ in range(5)] def gaussian_smooth(x, y, grid, sd): """平滑曲线""" weights = np.transpose([stats.norm.pdf(grid, m, sd) for m in x]) weights = weights / weights.sum(0) return (weights * y).sum(1) # 自定义颜色 COLORS = ["#D0D1E6", "#A6BDDB", "#74A9CF", "#2B8CBE", "#045A8D"] # 创建画布 fig, ax = plt.subplots(figsize=(10, 7)) # 生成图表 grid = np.linspace(1985, 2025, num=500) y_smoothed = [gaussian_smooth(x, y_, grid, 1) for y_ in y] ax.stackplot(grid, y_smoothed, colors=COLORS, baseline="sym") # 显示 plt.show()
结果如下:
16.地图
适用于地理空间数据分析
import pandas as pd
import folium
# 创建地图对象
m = folium.Map(location=[20, 0], tiles="OpenStreetMap", zoom_start=2)
# 创建图标数据
data = pd.DataFrame({
'lon': [-58, 2, 145, 30.32, -4.03, -73.57, 36.82, -38.5],
'lat': [-34, 49, -38, 59.93, 5.33, 45.52, -1.29, -12.97],
'name': ['Buenos Aires', 'Paris', 'melbourne', 'St Petersbourg', 'Abidjan', 'Montreal', 'Nairobi', 'Salvador'],
'value': [10, 12, 40, 70, 23, 43, 100, 43]
}, dtype=str)
# 添加信息
for i in range(0,len(data)):
folium.Marker(
location=[data.iloc[i]['lat'], data.iloc[i]['lon']],
popup=data.iloc[i]['name'],
).add_to(m)
# 保存
m.save('map.html')
结果如下:
#IT##程序员##经验分享##编程##数据挖掘##Python#
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/123713.html