ax.add_patch()的使用

这段代码展示了如何使用matplotlib库在子区中创建并修改圆形和矩形补丁,包括调整颜色、透明度、边框样式等。通过设置坐标轴范围和比例,实现了不同图形的布局和展示。
部署运行你感兴趣的模型镜像

作用:为图像添加补丁,具体代码如下代码所示。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle

# 创建画布
fig = plt.figure(figsize=(12, 8),
                 facecolor='beige',  # 米黄色
                 )
# 划分子区
axes = fig.subplots(nrows=2,
                    ncols=2,
                    )

# ---------------------------------  subplot(221) ---------------------------------
ax = axes[0, 0]
circle = Circle(xy=(2, 2),  # 圆心坐标
                radius=2,  # 半径
                fc='white',  # facecolor
                ec='cornflowerblue',  # 浅蓝色,矢车菊蓝

                )
ax.add_patch(p=circle)
circle.set(facecolor='yellow',
           alpha=0.5,
           hatch='/',
           ls='-.',
           ec='r'
           )

# 调整坐标轴刻度范围
ax.set(xlim=(-1, 5),
       ylim=(-1, 5)
       )

# ---------------------------------  subplot(222) ---------------------------------
ax = axes[0, 1]
rectangle = ax.patch
rectangle.set(facecolor='gold',
              alpha=0.7
              )

circle = Circle(xy=(2, 2),  # 圆心
                radius=2,  # 半径
                )
ax.add_patch(p=circle)
circle.set(fc='red',  # facecolor
           ec='green',  # edgecolor,
           alpha=0.6,
           lw=2,  # line widht
           )

# 调整坐标轴
ax.set(xlim=(-1, 5),
       ylim=(-1, 5),
       aspect='equal'  # x 轴和 y 轴的刻度单位比率
       )

# ---------------------------------  subplot(223) ---------------------------------
ax = axes[1, 0]
rectangle = ax.patch
rectangle.set(facecolor='palegreen',  # 淡绿色,苍绿色
              alpha=1
              )

circle = Circle(xy=(2, 2),  # 圆心
                radius=2,  # 半径
                )
ax.add_patch(p=circle)
circle.set(fc='red',  # facecolor
           ec='yellow',  # edgecolor,
           alpha=0.6,
           lw=5,  # line widht
           )

# 调整坐标轴
ax.axis('equal'  # x 轴和 y 轴的刻度单位比率
        )

# ---------------------------------  subplot(224) ---------------------------------
ax = axes[1, 1]
rectangle = ax.patch
rectangle.set(facecolor='lightskyblue',
              alpha=1
              )

circle = Circle(xy=(2, 2),  # 圆心
                radius=2,  # 半径
                )
ax.add_patch(p=circle)
circle.set(fc='white',  # facecolor
           ec='magenta',  # edgecolor, 品红
           alpha=0.6,
           lw=5,  # line widht
           )

# 调整坐标轴
ax.axis([-1, 5, 1, 5])  # 坐标轴刻度范围 [xmin, xmax, ymin, ymax]
ax.set(aspect='equal',  # x 轴和 y 轴的刻度单位比率
       yticks=range(-1, 6, 1)  # 刻度位置
       )

# 设置子区布局
plt.subplots_adjust(left=0.1,
                    right=0.8
                    )

# 显示图形
plt.show()

 

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

#下面程序运行时报错,请修改,不要减少功能,给出全部代码 Font 'default' does not have a glyph for '\u2212' [U+2212], substituting with a dummy symbol. ===================================== import sys import numpy as np from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QGroupBox, QLabel, QSpinBox, \ QComboBox, QPushButton, QFormLayout from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure import matplotlib.patches as patches class SatelliteCommunicationSimulator(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("卫星通信干扰仿真系统") self.setGeometry(100, 100, 1200, 800) # 初始化参数 self.init_parameters() # 创建界面 self.init_ui() # 初始化显示 self.update_all_plots() def init_parameters(self): # 初始参数设置 self.frequency = 2400.0 # MHz self.data_rate = 100.0 # kbps self.signal_power = 20.0 # dBm self.jamming_power = 30.0 # dBm self.jamming_frequency = 2400.0 # MHz self.jamming_type = "CW" # CW, FM, AM self.jamming_mode = "ON" # ON, OFF # 位置参数 self.aircraft1_pos = [100, 150] self.aircraft2_pos = [400, 250] self.satellite_pos = [250, 200] self.jammer_pos = [150, 100] # 生成波形数据 self.time = np.linspace(0, 10, 1000) self.data_signal = np.sin(2 * np.pi * 5 * self.time) + 0.5 * np.sin(2 * np.pi * 10 * self.time) self.jamming_signal = 2 * np.sin(2 * np.pi * 20 * self.time) self.combined_signal = self.data_signal + self.jamming_signal def init_ui(self): # 创建主窗口部件 central_widget = QWidget() self.setCentralWidget(central_widget) # 创建主布局 main_layout = QHBoxLayout(central_widget) # 创建控制面板 control_panel = self.create_control_panel() main_layout.addWidget(control_panel, 1) # 创建显示区域 display_area = self.create_display_area() main_layout.addWidget(display_area, 3) def create_control_panel(self): # 创建控制面板 control_panel = QWidget() layout = QVBoxLayout(control_panel) # 通信参数设置 comm_group = QGroupBox("通信参数设置") comm_layout = QFormLayout() self.freq_spin = QSpinBox() self.freq_spin.setRange(1000, 5000) self.freq_spin.setValue(int(self.frequency)) self.freq_spin.setSuffix(" MHz") comm_layout.addRow("频率:", self.freq_spin) self.data_rate_spin = QSpinBox() self.data_rate_spin.setRange(1, 1000) self.data_rate_spin.setValue(int(self.data_rate)) self.data_rate_spin.setSuffix(" kbps") comm_layout.addRow("数据速率:", self.data_rate_spin) self.signal_power_spin = QSpinBox() self.signal_power_spin.setRange(-50, 50) self.signal_power_spin.setValue(int(self.signal_power)) self.signal_power_spin.setSuffix(" dBm") comm_layout.addRow("信号功率:", self.signal_power_spin) comm_group.setLayout(comm_layout) layout.addWidget(comm_group) # 干扰参数设置 jammer_group = QGroupBox("干扰参数设置") jammer_layout = QFormLayout() self.jamming_power_spin = QSpinBox() self.jamming_power_spin.setRange(-50, 50) self.jamming_power_spin.setValue(int(self.jamming_power)) self.jamming_power_spin.setSuffix(" dBm") jammer_layout.addRow("干扰功率:", self.jamming_power_spin) self.jamming_freq_spin = QSpinBox() self.jamming_freq_spin.setRange(1000, 5000) self.jamming_freq_spin.setValue(int(self.jamming_frequency)) self.jamming_freq_spin.setSuffix(" MHz") jammer_layout.addRow("干扰频率:", self.jamming_freq_spin) self.jamming_type_combo = QComboBox() self.jamming_type_combo.addItems(["CW", "FM", "AM"]) self.jamming_type_combo.setCurrentText(self.jamming_type) jammer_layout.addRow("干扰类型:", self.jamming_type_combo) self.jamming_mode_combo = QComboBox() self.jamming_mode_combo.addItems(["ON", "OFF"]) self.jamming_mode_combo.setCurrentText(self.jamming_mode) jammer_layout.addRow("干扰模式:", self.jamming_mode_combo) jammer_group.setLayout(jammer_layout) layout.addWidget(jammer_group) # 干扰效果数据显示 effect_group = QGroupBox("干扰效果数据") effect_layout = QVBoxLayout() self.snr_label = QLabel("信噪比(SNR): 0.0 dB") self.ebno_label = QLabel("Eb/No: 0.0 dB") self.ber_label = QLabel("误码率(BER): 0.00e+00") effect_layout.addWidget(self.snr_label) effect_layout.addWidget(self.ebno_label) effect_layout.addWidget(self.ber_label) effect_group.setLayout(effect_layout) layout.addWidget(effect_group) # 控制按钮 button_layout = QHBoxLayout() self.start_btn = QPushButton("开始仿真") self.start_btn.clicked.connect(self.start_simulation) button_layout.addWidget(self.start_btn) self.stop_btn = QPushButton("停止仿真") self.stop_btn.clicked.connect(self.stop_simulation) button_layout.addWidget(self.stop_btn) self.reset_btn = QPushButton("重置仿真") self.reset_btn.clicked.connect(self.reset_simulation) button_layout.addWidget(self.reset_btn) layout.addLayout(button_layout) # 添加弹簧,使控件居中 layout.addStretch() return control_panel def create_display_area(self): # 创建显示区域 display_widget = QWidget() layout = QVBoxLayout(display_widget) # 创建matplotlib图形 self.figure = Figure(figsize=(10, 8), dpi=100) self.canvas = FigureCanvas(self.figure) layout.addWidget(self.canvas) # 创建三个子图 self.ax_deployment = self.figure.add_subplot(2, 2, 1) self.ax_commu = self.figure.add_subplot(2, 2, 2) self.ax_jammer = self.figure.add_subplot(2, 2, 3) self.ax_effect = self.figure.add_subplot(2, 2, 4) self.figure.tight_layout() return display_widget def update_all_plots(self): # 更新所有图表 self.update_deployment_plot() self.update_waveform_plots() self.update_effect_data() def update_deployment_plot(self): self.ax_deployment.clear() self.ax_deployment.set_xlim(0, 500) self.ax_deployment.set_ylim(0, 400) self.ax_deployment.set_title("卫星通信部署示意") self.ax_deployment.set_xlabel("X坐标") self.ax_deployment.set_ylabel("Y坐标") self.ax_deployment.grid(True) # 绘制飞机 aircraft1 = patches.Circle(self.aircraft1_pos, 15, color='blue', alpha=0.7) self.ax_deployment.add_patch(aircraft1) self.ax_deployment.text(self.aircraft1_pos[0], self.aircraft1_pos[1] - 20, "飞机1", ha='center', va='center', fontsize=10) aircraft2 = patches.Circle(self.aircraft2_pos, 15, color='green', alpha=0.7) self.ax_deployment.add_patch(aircraft2) self.ax_deployment.text(self.aircraft2_pos[0], self.aircraft2_pos[1] - 20, "飞机2", ha='center', va='center', fontsize=10) # 绘制卫星 satellite = patches.Circle(self.satellite_pos, 20, color='red', alpha=0.7) self.ax_deployment.add_patch(satellite) self.ax_deployment.text(self.satellite_pos[0], self.satellite_pos[1] - 25, "卫星", ha='center', va='center', fontsize=10) # 绘制干扰机 jammer = patches.Circle(self.jammer_pos, 15, color='orange', alpha=0.7) self.ax_deployment.add_patch(jammer) self.ax_deployment.text(self.jammer_pos[0], self.jammer_pos[1] - 20, "干扰机", ha='center', va='center', fontsize=10) # 绘制连接线 # 飞机1到卫星 self.ax_deployment.plot([self.aircraft1_pos[0], self.satellite_pos[0]], [self.aircraft1_pos[1], self.satellite_pos[1]], 'b-', linewidth=1, alpha=0.7) # 卫星到飞机2 self.ax_deployment.plot([self.satellite_pos[0], self.aircraft2_pos[0]], [self.satellite_pos[1], self.aircraft2_pos[1]], 'g-', linewidth=1, alpha=0.7) # 干扰机到卫星(如果干扰开启) if self.jamming_mode == "ON": self.ax_deployment.plot([self.jammer_pos[0], self.satellite_pos[0]], [self.jammer_pos[1], self.satellite_pos[1]], 'r--', linewidth=1, alpha=0.7) self.canvas.draw() def update_waveform_plots(self): # 更新波形图表 self.ax_commu.clear() self.ax_commu.plot(self.time, self.data_signal, 'b-', linewidth=1) self.ax_commu.set_title("通信信号") self.ax_commu.set_xlabel("时间 (s)") self.ax_commu.set_ylabel("幅度") self.ax_commu.grid(True) self.ax_jammer.clear() self.ax_jammer.plot(self.time, self.jamming_signal, 'r-', linewidth=1) self.ax_jammer.set_title("干扰信号") self.ax_jammer.set_xlabel("时间 (s)") self.ax_jammer.set_ylabel("幅度") self.ax_jammer.grid(True) self.ax_effect.clear() self.ax_effect.plot(self.time, self.combined_signal, 'g-', linewidth=1) self.ax_effect.set_title("混合信号") self.ax_effect.set_xlabel("时间 (s)") self.ax_effect.set_ylabel("幅度") self.ax_effect.grid(True) self.canvas.draw() def update_effect_data(self): # 计算干扰效果数据 snr = self.signal_power - self.jamming_power ebno = snr # 简化计算 # 简单的BER计算(基于SNR) ber = 0.5 * np.erfc(np.sqrt(10 ** (ebno / 10) / 2)) self.snr_label.setText(f"信噪比(SNR): {snr:.1f} dB") self.ebno_label.setText(f"Eb/No: {ebno:.1f} dB") self.ber_label.setText(f"误码率(BER): {ber:.2e}") def update_simulation(self): # 更新仿真参数 self.frequency = float(self.freq_spin.value()) self.data_rate = float(self.data_rate_spin.value()) self.signal_power = float(self.signal_power_spin.value()) self.jamming_power = float(self.jamming_power_spin.value()) self.jamming_frequency = float(self.jamming_freq_spin.value()) self.jamming_type = self.jamming_type_combo.currentText() self.jamming_mode = self.jamming_mode_combo.currentText() # 更新波形数据 self.data_signal = np.sin(2 * np.pi * 5 * self.time) + 0.5 * np.sin(2 * np.pi * 10 * self.time) self.jamming_signal = 2 * np.sin(2 * np.pi * 20 * self.time) self.combined_signal = self.data_signal + self.jamming_signal # 更新所有图表 self.update_all_plots() def start_simulation(self): # 启动仿真 self.update_simulation() def stop_simulation(self): # 停止仿真 pass def reset_simulation(self): # 重置仿真 self.freq_spin.setValue(int(self.frequency)) self.data_rate_spin.setValue(int(self.data_rate)) self.signal_power_spin.setValue(int(self.signal_power)) self.jamming_power_spin.setValue(int(self.jamming_power)) self.jamming_freq_spin.setValue(int(self.jamming_frequency)) self.jamming_type_combo.setCurrentText(self.jamming_type) self.jamming_mode_combo.setCurrentText(self.jamming_mode) self.update_all_plots() def closeEvent(self, event): # 程序关闭时的处理 event.accept() def main(): app = QApplication(sys.argv) app.setStyle('Fusion') # 使用Fusion样式,使界面更美观 # 创建并显示主窗口 simulator = SatelliteCommunicationSimulator() simulator.show() # 运行应用程序 sys.exit(app.exec_()) if __name__ == "__main__": main()
最新发布
10-06
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值