почему аннотации для некоторых точек данных BarMark имеют два значения в диаграммах swiftui?
У меня есть диаграмма, показывающая прогноз на 10 дней с использованием Weatherkit, я хочу показать минимальную и максимальную температуру в день, поэтому я использую BarMark с двумя значениями по оси X. Я хочу показать аннотацию для минимума и один для максимума. но почему-то некоторые из них кажутся двойными с разными значениями.
это проблема Apple или проблема с моим кодом?
struct TenDayForecastViewChart: View {
let dayWeatherList: [DayWeather]
var body: some View {
VStack(alignment: .leading) {
Text("10-DAY FORECAST")
.font(.caption)
.opacity(0.5)
.padding()
Chart{
ForEach(dayWeatherList, id: \.date) { dailyWeather in
BarMark(xStart: .value("Temperature", dailyWeather.lowTemperature.converted(to: .fahrenheit).value),
xEnd: .value("Temperature", dailyWeather.highTemperature.converted(to: .fahrenheit).value),
y: .value("Day", dailyWeather.date.formatAsAbbreviatedDay())
)
.foregroundStyle(Color.black)
.annotation(position: .overlay, alignment: .leading) {
HStack {
//Image(systemName: "\(dailyWeather.symbolName)").foregroundColor(.white)
Text("\(dailyWeather.lowTemperature.converted(to: .fahrenheit).value, format: .number.precision(.fractionLength(0)))")
.foregroundColor(.white)
}
}
.annotation(position: .overlay, alignment: .trailing) {
Text("\(dailyWeather.highTemperature.converted(to: .fahrenheit).value, format: .number.precision(.fractionLength(0)))")
.foregroundColor(.blue)
}
}
}
//.chartLegend(position: .top, alignment: .bottomTrailing)
.chartXAxis(.hidden)
//.chartYAxis(.hidden)
.frame(height: 250)
.padding(.horizontal)
}
}
}
1 ответ
Я полагаю, что за ваши 10 дней у вас будет по 2 раза "Вс", "Пн", "Вт" каждый. Таким образом, значение графика y для этих точек данных идентично, и по умолчаниюBarCharts
добавляет их вместе.
- Вы можете пройти полный
Date
(не только строка дня) в BarChart и используйте
.value("Day", dailyWeather.date, unit: .day)
и добавьте пользовательское форматирование в.chartYAxis
:
.chartYAxis {
AxisMarks(values: .stride(by: .day)) { _ in
AxisGridLine()
AxisTick()
AxisValueLabel(format: .dateTime.weekday(.abbreviated), centered: true)
}
}