Python数据可视化科技图表绘制系列教程(八)

目录

基础气泡图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()
基础气泡图1_1
基础气泡图1_2

基础气泡图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()
基础气泡图2

带边界的气泡图

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
极坐标下的气泡图2
极坐标下的气泡图3

等高线图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()
等高线图1

等高线图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()
等高线图2

等高线图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()
等高线图3

三元相图

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()
热图1

热图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()
热图2

热图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()
热图3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@HNUSTer_CUMTBer

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值