почему аннотации для некоторых точек данных 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добавляет их вместе.

  1. Вы можете пройти полный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)
    }
}
Другие вопросы по тегам