DateListPlot version
DateListPlot[data, Joined -> False,
FrameTicks -> {{None, tickLabels}, {Automatic, None}}]
ordinalScale =
AssociationThread[{"Confederate victory", "Inconclusive",
"Union strategic victory", "Union victory",
"Decisive Union victory"} -> {-1, 0, 1, 2, 3}];
tickLabels = KeyValueMap[List /* Reverse, ordinalScale];
topOutcomes = Query[
DeleteMissing /* KeySortBy[DateObject[#["StartDate"], "Day"] &],
First /* (ordinalScale@# &)
]@EntityValue[UlyssesSGrantBattles, "OutcomeNotes",
"EntityAssociation"];
battleDates = KeyMap[DateObject[#["StartDate"], "Day"] &, topOutcomes];
data = Rule[TimeSeries[battleDates], Keys[topOutcomes]];