目录
基础气泡图1
基础气泡图2
带边界的气泡图
极坐标下的气泡图
等高线图1
等高线图2
等高线图3
三元相图
热图1
热图2
热图3
【声明】:未经版权人书面许可,任何单位或个人不得以任何形式复制、发行、出租、改编、汇编、传播、展示或利用本博客的全部或部分内容,也不得在未经版权人授权的情况下将本博客用于任何商业目的。但版权人允许个人学习、研究、欣赏等非商业性用途的复制和传播。非常推荐大家学习《Python数据可视化科技图表绘制》这本书籍。
基础气泡图1
import matplotlib.pyplot as plt # 导入Matplotlib库并简写为plt import seaborn as sns # 导入Seaborn库并简写为sns from gapminder import gapminder # 导入数据集 plt.rcParams['figure.figsize'] = [8, 8] # 设置笔记本中的图形大小 data = gapminder.loc[gapminder.year == 2007] # 从数据集中选择特定年份的数据 # 使用scatterplot函数绘制气泡地图 sns.scatterplot(data=data, x="gdpPercap", y="lifeExp", size="pop", legend=False, sizes=(20, 1600)) # 保存图片 plt.savefig("P160基础气泡图1_1.png", dpi=600, bbox_inches='tight', transparent=True) plt.show() sns.set_style("darkgrid") # 设置Seaborn主题为"darkgrid" # 使用scatterplot函数绘制气泡地图 sns.scatterplot(data=data, x="gdpPercap", y="lifeExp", size="pop", hue="continent", palette="viridis", edgecolor="blue", alpha=0.5, sizes=(10, 1600)) # 添加标题(主标题和轴标题) plt.xlabel("Gdp per Capita") # x轴标题 plt.ylabel("Life Expectancy") # y轴标题 # 将图例放置在图形外部 plt.legend(bbox_to_anchor=(1, 1), loc='upper left', fontsize=15) # 保存图片 plt.savefig("P160基础气泡图1_2.png", dpi=600, bbox_inches='tight', transparent=True) plt.show()基础气泡图2
import pandas as pd # 导入Pandas库并简写为pd import matplotlib.pyplot as plt # 导入Matplotlib库并简写为plt data = pd.read_csv(r'E:\PythonProjects\experiments_figures\绘图案例数据\gapminderData.csv') # 读取数据 data.head(2) # 检查前两行数据 # 将分类列(continent)转换为数值型分组(group1->1,group2->2...) data['continent'] = pd.Categorical(data['continent']) plt.figure(figsize=(8, 6)) # 设置图形大小 data1952 = data[data.year == 1952] # 选取1952年的数据子集 # 绘制散点图 plt.scatter( x=data1952['lifeExp'], # x轴为预期寿命 y=data1952['gdpPercap'], # y轴为人均GDP s=data1952['pop'] / 50000, # 气泡大小与人口数量相关 c=data1952['continent'].cat.codes, # 根据大洲分类编码设置气泡颜色 cmap="Accent", # 使用Accent调色板 alpha=0.6, # 设置透明度 edgecolors="white", # 设置气泡边缘颜色 linewidth=2) # 设置气泡边缘线宽度 # 添加标题(主标题和轴标题) plt.yscale('log') # 设置y轴为对数尺度 plt.xlabel("Life Expectancy") # x轴标题 plt.ylabel("GDP per Capita") # y轴标题 plt.title("Year 1952") # 主标题 plt.ylim(10, 50000) # 设置y轴范围 plt.xlim(30, 75) # 设置x轴范围 # 保存图片 plt.savefig("P162基础气泡图2.png", dpi=600, bbox_inches='tight', transparent=True) plt.show()带边界的气泡图
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.spatial import ConvexHull # 步骤 1:准备数据 midwest = pd.read_csv(r"E:\PythonProjects\experiments_figures\绘图案例数据\midwest_filter.csv") # 导入数据 # 每个唯一 midwest['category']对应一个颜色 categories = np.unique(midwest['category']) # 获取唯一的类别 colors = [plt.cm.tab10(i / float(len(categories) - 1)) for i in range(len(categories))] # 为每个类别选择颜色 # 步骤 2:绘制散点图,每个类别使用唯一颜色 fig = plt.figure(figsize=(10, 6), dpi=80, facecolor='w', edgecolor='k') # 创建图形 for i, category in enumerate(categories): # 假设 'dot_size' 是数据框中的一列 plt.scatter('area', 'poptotal', data=midwest.loc[midwest.category == category, :], s=midwest.loc[midwest.category == category, 'dot_size'], # 修复大小参数 color=colors[i], # 使用 color 参数代替 c 参数 label=str(category), edgecolors='black', linewidths=.5, alpha=0.5) # 绘制气泡图 # 步骤 3:绘制围绕数据点的多边形 def encircle(x, y, ax=None, **kw): if not ax: ax = plt.gca() p = np.c_[x, y] hull = ConvexHull(p) poly = plt.Polygon(p[hull.vertices, :], **kw) ax.add_patch(poly) # 选择要绘制圈的数据 midwest_encircle_data = midwest.loc[midwest.state == 'IN', :] # 绘制围绕数据点的多边形 encircle(midwest_encircle_data.area, midwest_encircle_data.poptotal, ec="k", fc="gold", alpha=0.1) encircle(midwest_encircle_data.area, midwest_encircle_data.poptotal, ec="firebrick", fc="none", linewidth=1.5) # 步骤 4:修饰图形 plt.gca().set(xlim=(0.0, 0.1), ylim=(0, 90000), xlabel='Area', ylabel='Population') # 设置坐标轴的范围和标签 plt.xticks(fontsize=12) plt.yticks(fontsize=12) # 设置刻度的字体大小 plt.title("Scatterplot of Midwest Area vs Population", fontsize=18) # 设置标题 plt.legend(fontsize=12) # 显示图例 # 保存图片 plt.savefig("P163带边界的气泡图.png", dpi=600, bbox_inches='tight', transparent=True) plt.show()极坐标下的气泡图
import matplotlib.pyplot as plt import numpy as np np.random.seed(19781101) # 固定随机种子,以便结果可复现 # 计算面积和颜色 N = 150 r = 2 * np.random.rand(N) theta = 2 * np.pi * np.random.rand(N) area = 200 * r ** 2 colors = theta # 创建第1个图形 fig = plt.figure() ax = fig.add_subplot(projection='polar') c = ax.scatter(theta, r, c=colors, s=area, cmap='hsv', alpha=0.75) # 保存图片 plt.savefig("P164极坐标下的气泡图1.png", dpi=600, bbox_inches='tight', transparent=True) plt.show() # 创建第2个图形 fig = plt.figure() ax = fig.add_subplot(projection='polar') c = ax.scatter(theta, r, c=colors, s=area, cmap='hsv', alpha=0.75) # 设置极坐标原点的位置 ax.set_rorigin(-2.5) ax.set_theta_zero_location('W', offset=10) # 保存图片 plt.savefig("P164极坐标下的气泡图2.png", dpi=600, bbox_inches='tight', transparent=True) plt.show() # 创建第3个图形 fig = plt.figure() ax = fig.add_subplot(projection='polar') c = ax.scatter(theta, r, c=colors, s=area, cmap='hsv', alpha=0.75) # 设置极坐标角度的范围 ax.set_thetamin(45) ax.set_thetamax(135) # 保存图片 plt.savefig("P164极坐标下的气泡图3.png", dpi=600, bbox_inches='tight', transparent=True) plt.show()等高线图1
import matplotlib.pyplot as plt import numpy as np from matplotlib.font_manager import FontProperties # 设置字体为支持中文的字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为黑体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 # 生成数据 x = np.linspace(-2, 2, 100) y = np.linspace(-2, 2, 100) X, Y = np.meshgrid(x, y) Z = np.sin(X) * np.cos(Y) levels = np.linspace(-1, 1, 20) # 定义等高线水平 plt.contour(X, Y, Z, levels=levels) # 创建等高线图,并指定等级 # 添加标签和标题 plt.xlabel('X轴') plt.ylabel('Y轴') plt.title('指定等级的等高线图') # 保存图片 plt.savefig("P166等高线图1.png", dpi=600, bbox_inches='tight', transparent=True) plt.show()等高线图2
import numpy as np import matplotlib.pyplot as plt delta = 0.0125 # 减小delta值,增加网格的间距 x = np.arange(-3.0, 3.0, delta) # 定义x范围为-3到3,间隔为delta y = np.arange(-2.0, 2.0, delta) # 定义y范围为-2到2,间隔为delta X, Y = np.meshgrid(x, y) # 生成网格坐标矩阵 Z1 = np.exp(-X ** 2 - Y ** 2) # 生成第1个二元正态分布数据 Z2 = np.exp(-(X - 1.5) ** 2 - (Y - 0.5) ** 2) # 生成第2个二元正态分布数据 # 高斯差分 Z = 10.0 * (Z2 - Z1) # 计算两个正态分布之间的差分值乘以10 plt.figure() # 创建新的图形窗口 CS = plt.contour(X, Y, Z) # 绘制等高线图 plt.clabel(CS, inline=1, fontsize=10) # 在等高线上添加标签,默认位置 plt.title('Simplest default with labels') # 设置标题 # 保存图片 plt.savefig("P167等高线图2.png", dpi=600, bbox_inches='tight', transparent=True) plt.show()等高线图3
import matplotlib.pyplot as plt import numpy as np import matplotlib.tri as tri # 设置字体为支持中文的字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为黑体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 np.random.seed(19781101) # 固定随机种子,以便结果可复现 npts = 200 ngridx = 100 ngridy = 200 x = np.random.uniform(-2, 2, npts) y = np.random.uniform(-2, 2, npts) z = x * np.exp(-x ** 2 - y ** 2) fig, (ax1, ax2) = plt.subplots(nrows=2, figsize=(6, 4), ) # 在网格上进行插值。通过在网格上进行插值,绘制不规则数据坐标的等高线图。 # 首先创建网格值。 xi = np.linspace(-2.1, 2.1, ngridx) yi = np.linspace(-2.1, 2.1, ngridy) # 在由 (xi,yi)定义的网格上线性插值数据 (x,y)。 triang = tri.Triangulation(x, y) interpolator = tri.LinearTriInterpolator(triang, z) Xi, Yi = np.meshgrid(xi, yi) zi = interpolator(Xi, Yi) # 注意,scipy.interpolate 提供了在网格上进行数据插值的方法。 # 下面的代码是对上面四行代码的替代写法: # from scipy.interpolate import griddata # zi=griddata((x,y),z,(xi[None,:],yi[:,None]),method='linear') ax1.contour(xi, yi, zi, levels=14, linewidths=0.5, colors='k') cntr1 = ax1.contourf(xi, yi, zi, levels=14, cmap="RdBu_r") fig.colorbar(cntr1, ax=ax1) ax1.plot(x, y, 'ko', ms=2) ax1.set(xlim=(-2, 2), ylim=(-2, 2)) ax1.set_title('grid and contour (%d points,%d grid points)' % (npts, ngridx * ngridy)) # 三角剖分等高线图 # 直接将无序的、不规则间隔的坐标提供给tricontour ax2.tricontour(x, y, z, levels=14, linewidths=0.5, colors='k') cntr2 = ax2.tricontourf(x, y, z, levels=14, cmap="RdBu_r") fig.colorbar(cntr2, ax=ax2) ax2.plot(x, y, 'ko', ms=2) ax2.set(xlim=(-2, 2), ylim=(-2, 2)) ax2.set_title('tricontour (%d points' % npts) plt.subplots_adjust(hspace=0.5) # 保存图片 plt.savefig("P168等高线图3.png", dpi=600, bbox_inches='tight', transparent=True) plt.show()三元相图
import matplotlib.pyplot as plt from mpltern.datasets import get_dirichlet_pdfs # 创建一个大图,并设置子图之间的间距 fig = plt.figure(figsize=(10.8, 8.8)) fig.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9, wspace=0.5, hspace=0.5, ) # 设置不同的Dirichlet分布参数 alphas = ((1.5, 1.5, 1.5), (5.0, 5.0, 5.0), (1.0, 2.0, 2.0), (2.0, 4.0, 8.0)) # 在每个子图中绘制对应参数设置下的Dirichlet分布 for i, alpha in enumerate(alphas): # 添加子图,使用三角图的投影 ax = fig.add_subplot(2, 2, i + 1, projection="ternary") # 获取Dirichlet分布的PDF数据 t, l, r, v = get_dirichlet_pdfs(n=61, alpha=alpha) # 绘制填充颜色表示PDF cmap = "Blues" shading = "gouraud" cs = ax.tripcolor(t, l, r, v, cmap=cmap, shading=shading, rasterized=True) # 绘制等高线以更清晰地显示PDF的形状 ax.tricontour(t, l, r, v, colors="k", linewidths=0.5) # 设置轴标签 ax.set_tlabel("$x_1$") ax.set_llabel("$x_2$") ax.set_rlabel("$x_3$") # 将轴标签放在三角图的内部 ax.taxis.set_label_position("tick1") ax.laxis.set_label_position("tick1") ax.raxis.set_label_position("tick1") # 设置子图标题,显示参数设置 ax.set_title("${\\mathbf{\\alpha}}$=" + str(alpha)) # 添加颜色条,显示PDF的颜色对应的数值 cax = ax.inset_axes([1.05, 0.1, 0.05, 0.9], transform=ax.transAxes) colorbar = fig.colorbar(cs, cax=cax) colorbar.set_label("PDF", rotation=270, va="baseline") # 保存图片 plt.savefig("P173三元相图.png", dpi=600, bbox_inches='tight', transparent=True) plt.show()热图1
import pandas as pd # 导入pandas库,用于数据处理和分析 import seaborn as sns # 导入seaborn库,用于数据可视化 import matplotlib.pyplot as plt # 导入matplotlib库用于绘图 # 导入数据集 df=pd.read_csv("E:/PythonProjects/experiments_figures/绘图案例数据/mtcars.csv") # 读取"mtcars.csv"的数据文件,并将数据存储在df中 # 删除非数值型的列 df_numeric = df.select_dtypes(include=['float64', 'int64']) # 选择数据集中的数值型列(包括float64和int64类型),并存储在df_numeric中 # 绘制热力图,显示数值型列之间的相关性,使用'viridis'颜色映射,将相关性系数标注在图上 plt.figure(figsize=(10, 5), dpi=200) # 创建图形对象 sns.heatmap(df_numeric.corr(), xticklabels=df_numeric.corr().columns, yticklabels=df_numeric.corr().columns, cmap='viridis', center=0, annot=True) # 使用Seaborn绘制热力图 # 添加修饰 plt.title('Correlogram of mtcars', fontsize=18) # 设置图形标题 plt.xticks(fontsize=12) # 设置x轴标签的字体大小为12 plt.yticks(fontsize=12, rotation=0) # 设置y轴标签的字体大小为12 # 保存图片 plt.savefig('P289热图.png', dpi=600, transparent=True) plt.show()热图2
from mlxtend.plotting import heatmap import matplotlib.pyplot as plt import numpy as np import pandas as pd # 加载房价数据集,并设置列名 df = pd.read_csv(r'E:\PythonProjects\experiments_figures\绘图案例数据\housing.data.txt', header=None, sep='\\s+') df.columns = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] df.head(2) # 输出略 from matplotlib import cm # 从Matplotlib库中导入颜色映射 cols = ['LSTAT', 'INDUS', 'NOX', 'RM', 'MEDV'] # 选择感兴趣的列 # 计算所选列的相关系数矩阵 corrmat = np.corrcoef(df[cols].values.T) # 绘制热图并指定行名和列名 fig, ax = heatmap(corrmat, column_names=cols, row_names=cols, cmap=cm.PiYG) # 将颜色条范围设置为-1到1 for im in ax.get_images(): im.set_clim(-1, 1) # 保存图片 plt.savefig('P294热图6.png', dpi=600, transparent=True) plt.show()热图3
import matplotlib.pyplot as plt import numpy as np vegetables = ["cucumber", "tomato", "lettuce", "asparagus", "potato", "wheat", "barley"] farmers = ["Farmer Joe", "Upland Bros.", "Smith Gardening", "Agrifun", "Organiculture", "BioGoods Ltd.", "Cornylee Corp."] harvest = np.array([[0.8, 2.4, 2.5, 3.9, 0.0, 4.0, 0.0], [2.4, 0.0, 4.0, 1.0, 2.7, 0.0, 0.0], [1.1, 2.4, 0.8, 4.3, 1.9, 4.4, 0.0], [0.6, 0.0, 0.3, 0.0, 3.1, 0.0, 0.0], [0.7, 1.7, 0.6, 2.6, 2.2, 6.2, 0.0], [1.3, 1.2, 0.0, 0.0, 0.0, 3.2, 5.1], [0.1, 2.0, 0.0, 1.4, 0.0, 1.9, 6.3]]) fig, ax = plt.subplots(figsize=(5, 5)) # 创建图形和轴对象 im = ax.imshow(harvest) # 绘制热图 # 显示所有刻度,并使用对应的列表条目进行标注 ax.set_xticks(np.arange(len(farmers))) ax.set_yticks(np.arange(len(vegetables))) ax.set_xticklabels(farmers) ax.set_yticklabels(vegetables) # 旋转刻度标签并设置对齐方式 plt.setp(ax.get_xticklabels(), rotation=30, ha="right", rotation_mode="anchor") # 循环遍历数据维度并创建文本注释 for i in range(len(vegetables)): for j in range(len(farmers)): text = ax.text(j, i, harvest[i, j], ha="center", va="center", color="w") # 设置标题和调整布局 ax.set_title("Harvest of local farmers (in tons/year)") fig.tight_layout() # 保存图片 plt.savefig('P295热图7.png', dpi=600, transparent=True) plt.show()