There are three main ways to fix this.
The first one is to attempt to select outputs which are unrelated, if possible. This only works if you are sending an amount of monero that can be represented with unrelated outputs. This means that if you have received a single payment, you won't be able to select unrelated inputs, since they're all related - unless one single input in that transaction is enough. This is partly taken care of by https://github.com/moneromooo-monero/bitmonero/commit/90fb5e411307a949779c65a1931f3462ee3a564d, which selects unrelated inputs first, before falling back to related ones. However, this can only work if you have enough unrelated outputs.
The second one is to add "streaming payments" to Monero. These would split a payment into multiple transactions, such that each transaction has a single input, and these transactions are randomly distributed in time, so they can't be linked together. This is a bit complicated, since it requires the recipient to have a concept of "not received, partly received, received", and it requires things like the wallet staying up long term so that transactions may be emitted over time.
The third one is to select fake outputs to be clustered around each real output. I'm not sure this really achieves the purpose. It might look good visually on the graph (ie, you can't see obvious correlations), but I think a computer will still see correlations just fine.
Once RingCT is in, this problem will also become less acute, since transactions will typically require less inputs, as amounts will not be split by denominations anymore. Howerver, it will still exist to some lesser extent, and that's the reason the patch above was made (and could be improved, I suppose, but it's unclear how right now).
tl;dr: just waiting a bit will fix most of it.