使用matplotlib箭头更改箭头的大小

时间:2013-03-29 11:02:21

标签: python matplotlib

我正在使用matplotlib中的箭来绘制矢量场。我想要 根据不同,改变每个箭头厚度的大小 产生矢量场特定箭头的数据的数量。因此 我正在寻找的不是箭头大小的一般规模转换,而是方式 一个一个地定制箭袋中箭头的粗细。 可能吗?你能救我吗?

2 个答案:

答案 0 :(得分:8)

linewidths plt.quiver参数控制箭头的粗细。如果您传递一维值的数组,则每个箭头的厚度不同。

例如,

widths = np.linspace(0, 2, X.size)
plt.quiver(X, Y, cos(deg), sin(deg), linewidths=widths)

创建的线宽从0增加到2。


import matplotlib.pyplot as plt
import numpy as np
sin = np.sin
cos = np.cos

# http://stackoverflow.com/questions/6370742/#6372413
xmax = 4.0
xmin = -xmax
D = 20
ymax = 4.0
ymin = -ymax
x = np.linspace(xmin, xmax, D)
y = np.linspace(ymin, ymax, D)
X, Y = np.meshgrid(x, y)
# plots the vector field for Y'=Y**3-3*Y-X
deg = np.arctan(Y ** 3 - 3 * Y - X)
widths = np.linspace(0, 2, X.size)
plt.quiver(X, Y, cos(deg), sin(deg), linewidths=widths)
plt.show()

产量

enter image description here

答案 1 :(得分:0)

@ unutbu的解决方案在matplotlib 2.0.0之后无效(请参阅this issuethis pull request)。从matplotlib 2.1.2开始,似乎没有#include <QApplication> #include <QtCharts> QT_CHARTS_USE_NAMESPACE int main(int argc, char *argv[]) { QApplication a(argc, argv); QChartView w; QBarSet *set0 = new QBarSet("bar1"); *set0 << 1 << 4 << 3 << 7 << 2 << 5 << 1 << 3 << 3 << 2 << 1 << 6 << 7 << 5; QBarSeries *series = new QBarSeries; series->append(set0); QChart *chart= new QChart; w.setChart(chart); chart->addSeries(series); w.show(); QGraphicsRectItem hoverItem; hoverItem.setBrush(QBrush(Qt::red)); hoverItem.setPen(Qt::NoPen); QObject::connect(set0, &QBarSet::hovered, [&w, &hoverItem](bool status, int /*index*/){ QPoint p = w.mapFromGlobal(QCursor::pos()); if(status){ QGraphicsItem *it = w.itemAt(p); hoverItem.setParentItem(it); hoverItem.setRect(it->boundingRect()); hoverItem.show(); } else{ hoverItem.setParentItem(nullptr); hoverItem.hide(); } }); return a.exec(); } 的参数正式支持箭头宽度的逐个配置。但仍有一些解决方法。

方法1

只需使用Python的循环和plt.quiver参数即可。这对于大数据来说会很慢。

width

the result image of above code

方法2

这只是一种解决方法,但如果我们设置import matplotlib.pyplot as plt import numpy as np # original code by user423805 # https://stackoverflow.com/a/6372413/5989200 xmax = 4.0 xmin = -xmax D = 20 ymax = 4.0 ymin = -ymax for y in np.linspace(ymin, ymax, D): for x in np.linspace(xmin, xmax, D): deg = np.arctan(y ** 3 - 3 * y - x) w = 0.005 * (y - ymin) / (ymax - ymin) # just example... plt.quiver(x, y, np.cos(deg), np.sin(deg), width=w) plt.show() ,则可以使用linewidths

edgecolors

the result image of above code

请注意,efiring是matplotlib的维护者之一,said

  

所以请将import matplotlib.pyplot as plt import numpy as np # original code by user423805 # https://stackoverflow.com/a/6372413/5989200 xmax = 4.0 xmin = -xmax D = 20 ymax = 4.0 ymin = -ymax x = np.linspace(xmin, xmax, D) y = np.linspace(ymin, ymax, D) X, Y = np.meshgrid(x, y) deg = np.arctan(Y ** 3 - 3 * Y - X) widths = np.linspace(0, 2, X.size) plt.quiver(X, Y, np.cos(deg), np.sin(deg), linewidths=widths, edgecolors='k') plt.show() kwarg与width一起使用; units仅用于控制轮廓粗细,当明确请求不同颜色的轮廓时。