【PyQt学习笔记】分别使用scatter()和Circle()绘制散点图和二维圆,附修改点大小的方法

目录

前言

一、Scatter()

1.参数与示例

2."s"参数详解,修改散点的大小 

二、Circle()

1.使用方法

2.示例

总结


前言

最近在开发一个小工具,主要是用作离散元计算结果可视化。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()

得到:

../../_images/sphx_glr_scatter_001.png

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

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JlexZzzz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值