我正在使用matplotlib中的箭来绘制矢量场。我想要 根据不同,改变每个箭头厚度的大小 产生矢量场特定箭头的数据的数量。因此 我正在寻找的不是箭头大小的一般规模转换,而是方式 一个一个地定制箭袋中箭头的粗细。 可能吗?你能救我吗?
答案 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()
产量
答案 1 :(得分:0)
@ unutbu的解决方案在matplotlib 2.0.0之后无效(请参阅this issue和this 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();
}
的参数正式支持箭头宽度的逐个配置。但仍有一些解决方法。
只需使用Python的循环和plt.quiver
参数即可。这对于大数据来说会很慢。
width
这只是一种解决方法,但如果我们设置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
请注意,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
仅用于控制轮廓粗细,当明确请求不同颜色的轮廓时。