Controlling Frequency of a Vibration Motor with Battery Voltage Output
This motor is barely spinning at 40 Hz.  Just applying the voltage indicated by the graph is not going to be very reliable.  Some motors under some conditions may not spin at all.

Especially since you're at the edge of the motor's operation, you need feedback to control the frequency.  The whole system would be too much to get into detail about here, but basically there are three parts, frequency sensing, the control algorithm, and a means of adjusting the current or voltage delivered to the motor.

A small piezo sensor might be a good choice for the frequency sensing.  A suitable circuit would amplify and filter this, and present the result to a microcontroller.  Since you only care about 40 Hz, you can run the signal into a A/D input.  This simplifies the analog electronics between the sensor and the micro.

The micro implements the control algorithm in firmware, probably running each A/D reading, at a few kHz.  The result of the algorithm is the control output, which is a number that goes up when the motor is too slow, and down when the motor is too fast.

The simplest way to drive the motor roughly proportional to the control output is via PWM.  Just about every micro has hardware to produce the PWM pulses for you.  After you set it up, all you do is write the control value to a register, and the PWM duty cycle changes as a result.  The PWM pulses control a transistor used as a low side switch.

I'd try to run the PWM at 24 kHz or maybe a bit higher.  That still results in a "long" pulse period for the purpose of minimizing switching losses, but is fast enough to be above most people's hearing, and won't let the current thru the motor coils change much in one pulse time.

Don't forget the flyback catch diode in reverse across the motor.  At this low voltage, that should definitely be a Schottky.