There can be a few things at work here.
The first one is, exactly what wind is the graph showing? Instantaneous wind, average wind (anything up to 10 minutes)?
The second is sampling error. How often does VWS store the wind data in the DB? If it's once a minute, then you miss wind gusts that happen in between the one minute data base writes.
That's one reason there is a separate wind gust entry.
Another possibility is data aliasing for graph generation. I suppose different packages handle it differently, but here is my experience.
Assume that the data is stored every minute. That's 1440 records per day. But the standard VWS graph image is only 300 pixels wide, and of that, the graph is only about 245 pixels wide.
If you try to plot 1440 dots on a 245 dot wide graph, it gets very ugly. (Been there, done that developing WeatherElement.) So, you need to somehow reduce the number of data points plotted on the graph.
1440/245 is ~5.8. rounding up, there's only room on the graph for about 1 of every 6 data points in the database.
Here's a graph of wind speed from a database of every one minute:
Here's the same database, same station 10 minute average:
And, the wind gust (highest wind measures in a 10 minute period, banging on the VP2 every 2.5 seconds looking for the highest wind):
I wrote the code for those graphs, so I know that the DB is sampled by dividing the number of points in the DB by the number of pixels in the graph (x), and then using every xth data point to plot the graph.
for the same VP2 station and same time span, here are VWS graphs for wind speed:
and gust:
Clearly VWS does some data manipulation to make cleaner graphs than we have figured out how to do.