python3 绘制盖尔圆

import numpy as np
import matplotlib.pyplot as plt

row_num = int(input("input nums of row:"))

# 用0初始化矩阵
mat = [[0] * row_num] * row_num

# 字符串分割成数字并转为复数类型
for i in range(row_num):
    mat[i] = input().split()
    mat[i] = [complex(j) for j in mat[i]]

mat = np.array(mat)
print(mat)

# 画圆采样
sample = np.linspace(-np.pi, np.pi, 100)

# 保持x,y轴刻度比例相同
plt.axis('equal')

for i in range(row_num):
    # 行盖尔圆半径
    r1 = sum(abs(mat[i, :])) - abs(mat[i][i])
    # 列盖尔圆半径
    r2 = sum(abs(mat[:, i])) - abs(mat[i][i])

    # 盖尔圆圆心
    point_x = mat[i][i].real
    point_y = mat[i][i].imag

    # 绘制圆心
    plt.plot(point_x, point_y, '.b')

    # 绘制圆(填充)
    plt.fill(r1 * np.sin(sample) + point_x,
             r1 * np.cos(sample) + point_y,
             'b',
             alpha=0.2)

    plt.fill(r2 * np.sin(sample) + point_x,
             r2 * np.cos(sample) + point_y,
             'g',
             alpha=0.2)

    # 标注
    plt.text(point_x,
             point_y,
             "G" + str(i + 1),
             fontdict={
                 'size': '12',
                 'color': 'k'
             })

# 绘制特征值点
[e, _] = np.linalg.eig(mat)
for i in e:
    plt.plot(i.real, i.imag, 'ro')

ax = plt.gca()
# 去掉默认边框刻度
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 设置x与y轴的位置
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))

# 指定x与y轴刻度数字位置
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')

plt.show()

输入test:
在这里插入图片描述

输出:
在这里插入图片描述

红点为特征值点,浅绿色是列盖尔圆,浅紫色是行盖尔圆,蓝点为圆心。

画圆部分,matplotlib 中没有直接根据圆心和半径画圆的方法,所以用采样(微分)的方法来绘制

import numpy as np
import matplotlib.pyplot as plt

sample = np.linspace(-np.pi, np.pi, 100)
# 半径为 r,圆心为(point_x, point_y)
plt.fill(r * np.sin(sample) + point_x, r * np.cos(sample) + point_y)

对 list 中元素类型进行统一转换,可一句搞定

l = ["12", "2.333", 23]
l1 = [float(i) for i in l]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值