Matplotlib Seaborn 一些图的画法

玫瑰图(roseChart)

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

sns.set_theme(font="SimHei", style='whitegrid')
data = np.random.rand(12) * 100
theta = np.linspace(0.0, 2 * np.pi, 12, endpoint=False)
sorted_data = np.sort(data)

plt.figure(figsize=(8, 6))
ax = plt.subplot(111, polar=True)
plt.bar(theta, sorted_data, linewidth=0, color=sns.color_palette('viridis', len(sorted_data)))

ax.set_xticks(theta)
ax.set_xticklabels(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])
ax.set_yticks([])

for i in ax.patches:
    ax.annotate(f"{i.get_height():.1f}", (i.get_x() + i.get_width() / 2, i.get_height()), va='bottom', ha='center')

plt.show()

theta 表示极坐标中的角度信息, 因为总共十二月份所以0到360平均分成12份, 在下面需要将data排序是因为玫瑰图是按照顺序一瓣一瓣的

使用 plt.subplot(polar=True) 来开启极坐标图 画出极坐标 下面画的图就都是在极坐标上画了

ax.annotate(): 这是 Matplotlib 中用于在图上添加注释的函数。

(i.get_x() + i.get_width() / 2, i.get_height()): 这是注释的位置。i.get_x() + i.get_width() / 2 表示每个条形图的中心位置的 x 坐标,i.get_height() 表示每个条形图的高度值,这个位置是注释的起始位置

雷达图(radarChart)

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns


name = ['语文', '英语', '数学', '科学', '社会']
values = [59, 62, 83, 65, 100]

angles = np.linspace(0, 2 * np.pi, len(name), endpoint=False).tolist()

# 闭合图形
values.append(values[0])
angles.append(angles[0])

sns.set_theme(font="SimHei")
plt.figure(figsize=(6,4))
ax = plt.subplot(111, polar=True)
plt.plot(angles, values, color='skyblue', linewidth=2, marker='o')
plt.fill(angles, values, color='skyblue', alpha=0.2)

for angle, value in zip(angles[:-1], values[:-1]):
    plt.text(angle, value, value, va='bottom', fontsize=10)

ax.set_xticks(angles[:-1])
ax.set_xticklabels(name)
ax.set_yticklabels([])

plt.show()

image-20240409153302588
image-20240409153302588

气泡图(咕噜咕噜Chart)

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np


np.random.seed(42)
n_patients = 30

age = np.random.randint(18, 70, n_patients)
bmi = np.random.uniform(18.5, 30.0, n_patients)

data = pd.DataFrame({'Age': age, 'BMI': bmi})


plt.figure(figsize=(10,6 ))
sns.scatterplot(data=data, x='Age', y='BMI', size='BMI', sizes=(100,1000), hue='Age', alpha=0.7)

plt.show()

image-20240409153820200
image-20240409153820200

数字卡片(Number Card)

import matplotlib.pyplot as plt
import seaborn as sns

# 定义要绘制的文本
text = "1625235"

# 创建一个新的图像
sns.set_theme(font="SimHei")
ax = plt.figure(figsize=(10, 2))
plt.axis('off')

# 绘制边框
plt.gca().add_patch(plt.Rectangle((0.2, 0.2), 0.6, 0.7, fill=True, color='skyblue'))
# 将文本绘制到图像上
ax.text(0.5, 0.5, text, color='black', fontsize=50, ha='center', va='center')

# 设置标题
plt.title("数字卡片", fontsize=20, color='darkblue')

# 显示图像
plt.show()

plt.gca().add_patch() 用来在画布上添加图表

plt.Rectangle()函数可以在画布上添加矩形

参数:

xy: (float, float) 矩形左下角坐标 (0.2, 0.2)

width: float矩形的宽度

height: float矩形的高度

fill: bool 是否填充矩形

image-20240410082604773
image-20240410082604773