目录
前言
最近在开发一个小工具,主要是用作离散元计算结果可视化。GUI是pyqt5,嵌入matplotlib。由于在绘图过程中需要绘制颗粒,用到matplotlib绘制二维圆或者点。我只是业余编程,写博客记录一下遇到的问题,大家仅供参考。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Scatter()
1.参数与示例
先来看看scatter()的所有参数。
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, *, plotnonfinite=False, data=None, **kwargs)
基本参数有:
- x, y → 散点的坐标,可以是数组
- s → 不是正常的面积大小,后面详细介绍。
- c → 颜色,也可以是数组但长度应与x、y一致。可以使用默认的颜色字符,如”r”,”b”等,也可以是”#0000FF”这种颜色格式字符串。
- marker → 点样式(默认值为实心圆,’o’,其余样式同plt.plot( ))
- alpha → 透明度
- linewidths→点的边缘线宽
- edgecolors→ 点的边缘颜色
更多参数请移步matplotlib文档。
请看例子:
import numpy as np
import matplotlib.pyplot as plt
Fixing random state for reproducibility
np.random.seed(19680801)
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = (30 * np.random.rand(N))**2 # 0 to 15 point radii
plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.show()
得到:
2.”s”参数详解,修改散点的大小
从上面的例子可以看出,每个点的大小和area中的值相差很大,那我们如何得到一个例如半径对于1(长度和坐标轴的1一致)的圆点呢?
“s”参数以平方磅为单位,而不是以像素为单位。point是最小的度量单位,在matplotlib中对应于固定长度1/72英寸。如果dpi是72的话,则一点便是一个像素。
1 point == fig.dpi/72. pixels
而且,不同的dpi对应的点大小也是不同的,更改窗口的大小也会导致变化。
每个点的磅数计算如下:
size_points =(2 * radius_pixels / fig_dpi * 72) ** 2
直接使用matplotlib transformations计算标记半径的像素大小,接下来看例子:
import numpy as np
import matplotlib.pyplot as plt
x = [1,2,3]
y = [1,2,3]
r = [1,2,3]
fig = plt.figure(figsize=(6, 6))
ax = fig.add_subplot(111, aspect='equal')
ax.grid(True) # 显示网格线
ax.set_xlim(0,8)
ax.set_ylim(0,8)
rr_pix = (ax.transData.transform(np.vstack([r, r]).T) - ax.transData.transform(np.vstack([np.zeros(3), np.zeros(3)]).T))
rpix, _ = rr_pix.T
size_pt = (2*rpix/fig.dpi*72)**2
scat = ax.scatter(x, y, s=size_pt, alpha=0.5)
fig.canvas.draw()
plt.show()
得到:
二、Circle()
1.使用方法
matplotlib.patches.Circle(xy, radius=5, **kwargs)
以xy为圆心创造一个半径为radius的圆
基本参数:
- xy→圆心
- radius→半径
- alpha→透明度
- facecolor→填充的颜色
- edgecolor→边缘线条的颜色
- linewidth→边缘线宽
2.示例
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
fig, ax = plt.subplots()
ax.set_title('Circle')
ax.axis('scaled') # 等比横纵坐标
cir = Circle(xy=(1,1),radius=1,facecolor='red')
ax.add_patch(cir) # 将圆添加到子图
ax.set_ylim(0,3)
ax.set_xlim(0,3)
plt.show()
得到:
总结
以上便是绘制点或圆的两种方法,另外我发现,绘制相同数量的圆点或Circle圆时,使用scatter()的速度更快,并且进行图系列交互操作不会卡顿。
参考链接:
matplotlib.pyplot.scatter — Matplotlib 3.4.2 documentation
matplotlib.patches.Circle — Matplotlib 3.4.2 documentation
https://blog.csdn.net/weixin_37988176/article/details/109420428?depth_1-
matplotlib – pyplot scatter plot marker size – Stack Overflow
python – Making a scatter marker as large as the Axes – Stack Overflow
Original: https://blog.csdn.net/jun_zhong866810/article/details/118876956
Author: JlexZzzz
Title: 【PyQt学习笔记】分别使用scatter()和Circle()绘制散点图和二维圆,附修改点大小的方法
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/766329/
转载文章受原作者版权保护。转载请注明原作者出处!