# Visualizing vector fields

```
import matplotlib.pyplot as plt
import numpy as np
import inspect
def f1(x): return np.tan(x)
def f2(x): return np.sin(x)
def f3(x): return np.cos(x)
def f4(x): return np.exp(x/30)/(x**3)
fs = [f1, f2, f3, f4]
start, end = -10, 11
A = np.array([(i,j) for i in range(start,end) for j in range(start,end)])
for f in fs:
B = f(A)
plt.scatter(A[:,0], A[:,1], s=10, color='black')
plt.scatter(B[:,0], B[:,1], s=10, color='black')
for Ac, Bc in zip(A, B):
Ax, Ay = Ac
Bx, By = Bc
plt.arrow(Ax, Ay, Bx, By, head_width=0.2, head_length=0.4, fc='k', ec='k', width=0.05)
plt.title('f(x) = ' + inspect.getsource(f).split('return ')[1])
plt.tight_layout()
plt.show()
```

There is a tradeoff between looking at too many data points at once, but learning about some wider pattern and looking at too few data points, but seeing the arrows more clearly. Sometimes, instead of evaluating the function at all points, we can choose to do so only at specific coordinates.