可视化库----Matplotlib进阶篇

本文详细介绍如何使用Python的Matplotlib库绘制正弦和余弦曲线,包括调整坐标轴、添加图例、注释特殊点等高级功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1创建三角函数及重构

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-np.pi,np.pi,256,endpoint=True)
C = np.cos(x)
S = np.sin(x)
plt.plot(x,C)
plt.plot(x,S)
plt.show()

1.2 重构1 线条

#线宽加颜色的修改
##### 'b-':表示color='blue',linestyle="-"
plt.plot(x,C,"b-",lw=2.5)  #lw是线宽
plt.plot(x,S,"r-",lw=2.5)
plt.show()

1.3 坐标轴重构

plt.xlim(x.min()*1.5,x.max()*1.5)
plt.ylim(C.min()*1.5,C.max()*1.5)

1.4 坐标刻度重构

plt.xticks([-np.pi,np.pi/2,0,np.pi/2,np.pi])
plt.yticks([-1,0,1])

1.5 坐标刻度重构2

###使得刻度变成真正的π
plt.xticks([-np.pi,np.pi/2,0,np.pi/2,np.pi],
           [r'$-\pi$',r'$-\pi/2$'r'$\pi/2$'r'$\pi$'])
plt.yticks([-1,0,1])

这里写图片描述

1.6坐标轴放到中间

ax = plt.gca()                          #通过plt.gca()获取当前的Axes对象 ax
ax.spines['right'].set_color('none')    #先把右边和上边的边界设置为不可见
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')   #下边界移动到0点
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')     #左边界移动到0点
ax.spines['left'].set_position(('data',0))

1.7图例区分正余弦

#########加图例
plt.polt(x,C,"b-",lw=2.5,label='cosine')
plt.polt(x,S,"r-",lw=2.5,label='sine')
plt.legend(loc="upper left")

1.8特殊点的注释

##########特殊点的注释
t = 2*np.pi/3
plt.plot([t,t],[0,np.cos(t)],color='blue',linewidth=2.5,linestyle='--')#需要标注的线
plt.scatter([t,],[np.cos(t,)],50,color='blue')#需要标注的点
plt.annotate(r'$\cos(\frac{2\pi}{3})=-\frac{1}{2}$',
             xy=(t,np.cos(t)),xycoords='data',
             xytext=(-90,-50),textcoords='offset points',fontsize=16,
             arrowprops=dict(arrowstyle="=>",connectionstyle="arc3,rad=.2"))
plt.plot([t,t],[0,np.sin(t)],color='red',linewidth=2.5,linestyle='--')#需要标注的线
plt.scatter([t,],[np.sin(t,)],50,color='blue')#需要标注的点
plt.annotate(r'$\cos(\frac{2\pi}{3})=-\frac{1}{2}$',
             xy=(t,np.sin(t)),xycoords='data',
             xytext=(-90,-50),textcoords='offset points',fontsize=16,
             arrowprops=dict(arrowstyle="=>",connectionstyle="arc3,rad=.2"))

1.9完整代码

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["font.sans-serif"]=['SimHei']  # 用于正常显示中文标签
plt.rcParams['axes.unicode_minus']=False  # 用来正常显示负号
#从pi导入256个点
x = np.linspace(-np.pi,np.pi,256,endpoint=True)
#根据x的值,求正弦和余弦函数
sin,cos = np.sin(x),np.cos(x)  #y值

plt.plot(x,sin,"g-",lw=2.5,label="正弦")
plt.plot(x,cos,"y-",lw=2.5,label="正弦")
#将x和Y轴放大1.5倍
plt.xlim(x.min()*1.5,x.max()*1.5)
plt.ylim(sin.min()*1.5,cos.max()*1.5)

#指定x,y轴的刻度
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
           [r"$-\pi$",r"$-\pi/2$",r"$0$",r"$\pi/2$",r"$\pi$"])#替换x中的数字为数学符号
plt.yticks([-1,0,1])

#获取AXES对象
ax = plt.gca()
#隐藏右边和上边界
ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")

#设置坐标轴的位置
ax.xaxis.set_ticks_position("bottom") #获取下边界
ax.yaxis.set_ticks_position("left")   #获取y轴左边界
ax.spines["bottom"].set_position(("data",0))
ax.spines["left"].set_position(("data",0))

# plt.xticks([])
plt.legend() #显示图例



#标注
t=2*np.pi/3
# 以下代码是:画出需要标注的蓝色的线,cos余弦
plt.plot([t,t],[0,np.cos(t)],  #前者是两点的x轴,后者是两者的Y值
         color ='blue',
         linewidth=2.5,
         linestyle="--")
#描点,先标注

plt.scatter([t,],[np.cos(t),], 20, color ='blue')#值,点的大小,颜色
#写注释
plt.annotate(r'$\cos(\frac{2\pi}{3})=-\frac{1}{2}$',
            xy=(t, np.cos(t)),#需要标注的位置
             xycoords='data',#文字的偏移量
             xytext=(-50, -50),#注释的文字的位置,是相对于备注点的位置
             textcoords='offset points',
             fontsize=10, #注释的大小
            arrowprops=dict(arrowstyle="->",connectionstyle="arc3,rad=.2"))#箭头指向的弯曲度


t=2*np.pi/3
# 以下代码是:画出需要标注的蓝色的线,sin正弦
plt.plot([t,t],[0,np.sin(t)],  #前者是两点的x轴,后者是两者的Y值
         color ='red',
         linewidth=2.5,
         linestyle="--")
plt.scatter([t,],[np.sin(t),], 20, color ='red')
#同上
plt.annotate(r'$\sin(\frac{2\pi}{3})=-\frac{1}{2}$',
            xy=(t, np.sin(t)),#需要标注点的位置
             xycoords='data', #文字的偏移量
             xytext=(50, 50),#注释的文字的位置,是相对于备注点的位置
             textcoords='offset points',
             fontsize=10, #注释的大小
            arrowprops=dict(arrowstyle="->",connectionstyle="arc3,rad=.2"))#箭头指向的弯曲度

#获取x,y轴的刻度,并设置字体
for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(12)  #字体大小
    label.set_bbox(dict(facecolor='w',edgecolor='b',alpha=0.5))  #为刻度设置边框格式
# facecolor背景填充颜色,edgecolor边框颜色,alpha透明度
plt.show()

                                                                                                                                                    这里写图片描述

### Matplotlib 高级用法概述 Matplotlib 是一个功能强大的数据可视化,支持多种高级特性和自定义选项。以下是关于其进阶使用的一些核心概念和示例代码。 #### 动态图表的实现 动态图表可以通过 `plt.ion()` 启动交互模式来实现[^4]。以下是一个简单的动态饼图的例子: ```python import matplotlib.pyplot as plt import numpy as np # 初始化数据 labels = ['A', 'B', 'C', 'D', 'E'] sizes = np.random.rand(len(labels)) # 创建动态饼图 plt.ion() # 打开交互模式 fig, ax = plt.subplots() pie = ax.pie(sizes, labels=labels) # 更新动态饼图 for i in range(100): new_sizes = np.random.rand(len(labels)) # 生成新的随机数据 for j, wedge in enumerate(pie[0]): wedge.set_height(new_sizes[j]) # 设置新高度 pie[0].set_sizes(new_sizes * 100) # 更新饼图的大小 plt.draw() # 重新绘制图表 plt.pause(0.1) # 暂停一小段时间以显示动画效果 ``` 此代码展示了如何通过循环更新数据并实时渲染图形,从而创建动态视觉效果。 #### 定制化雷达图 雷达图是一种多维数据分析的有效方式。Matplotlib 提供了灵活的方法来自定义这些图表[^5]。例如,可以调整线条样式、颜色填充以及标签位置等属性。下面展示了一个基础雷达图及其定制方法: ```python import numpy as np import matplotlib.pyplot as plt def radar_factory(num_vars, frame='circle'): theta = np.linspace(0, 2*np.pi, num_vars, endpoint=False) theta += np.pi/2 return theta N = 5 theta = radar_factory(N, frame='polygon') data = [ ('Group A', [37, 89, 65, 43, 71]), ('Group B', [55, 77, 91, 66, 48]) ] spoke_labels = ['Label {}'.format(i+1) for i in range(N)] fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(projection='polar')) ax.set_theta_offset(np.pi / 2) ax.set_theta_direction(-1) ax.set_rlabel_position(0) angles = [angle if angle <= 2 * np.pi else angle - 2 * np.pi for angle in theta] ax.fill_between(theta, data[0][1], color="tab:blue", alpha=0.25) plt.show() ``` 这段代码不仅实现了基本的功能,还加入了更多细节上的控制,比如角度偏移量设置 (`set_theta_offset`) 和方向反转 (`set_theta_direction`). #### 绘制复杂柱状图 为了提升柱状图的表现力,可以利用堆叠柱形图或多组对比等方式增强信息传递效率[^3]。这里给出一个多系列堆叠柱状图案例: ```python import matplotlib.pyplot as plt import numpy as np n_groups = 5 means_men = (20, 35, 30, 35, 27) std_men = (2, 3, 4, 1, 2) means_women = (25, 32, 34, 20, 25) std_women = (3, 5, 2, 3, 3) index = np.arange(n_groups) bar_width = 0.35 opacity = 0.4 error_config = {'ecolor': '0.3'} rects1 = plt.bar(index, means_men, bar_width, alpha=opacity, color='b', yerr=std_men, error_kw=error_config, label='Men') rects2 = plt.bar(index + bar_width, means_women, bar_width, alpha=opacity, color='r', yerr=std_women, error_kw=error_config, label='Women') plt.xlabel('Group') plt.ylabel('Scores') plt.title('Scores by group and gender') plt.xticks(index + bar_width / 2, ('A', 'B', 'C', 'D', 'E')) plt.legend() plt.tight_layout() plt.show() ``` 上述脚本构建了一幅双层柱状图用于比较不同群体间的得分差异情况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值