Charts: Hentikan duplikasi label sumbu.

Dibuat pada 24 Agu 2015  ·  51Komentar  ·  Sumber: danielgindi/Charts

Di dalam Aplikasi saya memiliki masalah ketika label pada sumbu kiri dari BarChartView atau LineChartView berulang.

Saya pertama kali menambahkan cuplikan di bawah ini untuk memastikan bahwa jumlah label pada sumbu tidak melebihi nilai maksimum dalam data y.

self.chartView.leftAxis.labelCount = self.chartView.data.yMax > YAxisMaxLabelCount ? YAxisMaxLabelCount : self.chartView.data.yMax;

Ini memastikan bahwa jika nilai maksimum dalam data y adalah 3 maka hanya akan ada label 3 di dalam sumbu. Sekarang ini berfungsi dengan baik jika grafik tidak interaktif, yaitu pengguna tidak dapat memperbesar grafik.

Segera setelah pengguna memperbesar, jumlah label tetap sama dan pemformat nilai mengisi celah yang memungkinkan nilai berulang.

_Contoh sumbu tanpa nilai duplikat_
screen shot 2015-08-24 at 5 07 29 pm

_Contoh bagan yang sama tetapi diperbesar_
screen shot 2015-08-24 at 5 07 54 pm

Tangkapan layar menunjukkan sumbu kiri mengulangi nilai 2 . Apa saran terbaik Anda untuk memecahkan masalah label berulang ini? Bantuan apa pun akan berterima kasih. Jika Anda memerlukan informasi lebih lanjut, beri tahu saya.

Terima kasih

Komentar yang paling membantu

Ini dirilis di 2.2.4, sebagai fitur granularity

Semua 51 komentar

Saya kira itu bukan label yang diduplikasi, tetapi berisi nilai desimal dan formatter integer? Anda perlu memeriksa apa nilai mentah untuk setiap label sumbu x dan bagaimana Anda memformatnya saat menggambar label xAxis di perender sumbu y.

Saya dapat melakukan ini dengan menambahkan tanda centang untuk memastikan interval setiap label selalu merupakan nilai keseluruhan.
Perubahan ada di dalam fungsi computeAxisValues() dari kelas ChartYAxisRenderer

var interval = ChartUtils.roundToNextSignificant(number: Double(rawInterval))
if(_yAxis.valueFormatter?.maximumFractionDigits == 0)
{
    interval = interval < 1 ? 1 : floor(interval)
}

Jika pemformat nilai meminta agar tidak ada digit pecahan maka ia akan menurunkan interval dan jika kurang dari bilangan bulat 1 ia menetapkan interval ke 1 .

Apakah Anda ingin permintaan tarik?

Terima kasih atas bantuan Anda.

Jika Anda memiliki nilai desimal, mengapa maximumFractionDigits adalah 0? Saya pikir itu masalah formatter.

Saya tidak ingin nilai desimal itu sebabnya saya menetapkan maximumFractionDigits = 0

sobat, data Anda desimal, dan Anda hanya ingin menggunakan formatter untuk mengabaikan angka pecahan, itu tidak masuk akal. Mengapa tidak mengonversi data Anda ke bilangan bulat terlebih dahulu?

Nilai y yang saya berikan pada grafik adalah

(1, 3, 2, 0, 0, 7, 0)

Setelah saya membuat ChartDataSet nilai-nilai ini kemudian berlipat ganda.

ChartDataSet, label: , 7 entries:
ChartDataEntry, xIndex: 0, value 1.0
ChartDataEntry, xIndex: 1, value 3.0
ChartDataEntry, xIndex: 2, value 2.0
ChartDataEntry, xIndex: 3, value 0.0
ChartDataEntry, xIndex: 4, value 0.0
ChartDataEntry, xIndex: 5, value 7.0
ChartDataEntry, xIndex: 6, value 0.0

Ini karena Kelas ChartDataEntry Anda memiliki nilai sebagai Double

/// the actual value (y axis)
public var value = Double(0.0)

Meskipun nilai telah diubah menjadi dua kali lipat, bagan menunjukkan peningkatan label yang benar pada awalnya tetapi segera setelah bagan diperbesar, ChartYAxisRenderer ingin mengisi celah dan karena pemformat nilai saya menghapus semua digit pecahan itu menunjukkan sebagai nilai duplikat.

Saya tidak ingin bagan menganggap saya ingin nilai tambahan di antara bilangan bulat karena hanya ingin menampilkan label untuk bilangan bulat.

Jadi ini mengarahkan saya untuk melihat bahwa saya menyediakan data yang benar ke grafik, tetapi grafik membuat asumsi tentang apa yang ingin saya lakukan. Ini bagus untuk default tetapi harus memberikan opsi untuk hanya menampilkan bilangan bulat pada sumbu juga.

Dengan menambahkan tanda centang terhadap pemformat nilai, ini memungkinkan perilaku ini. Anda mungkin tahu cara yang lebih baik untuk memberikan perilaku ini daripada memeriksa pemformat nilai tetapi ini adalah kasus penggunaan yang saya inginkan oleh beberapa orang.

Saya baru saja memperhatikan bahwa saya menggunakan basis kode di komit a7e30dd16fbfaecb8e44c01ad8618a3a745fd101 dan ketika perubahan ini diterapkan ke komit terbaru Bagan, itu tidak bertindak seperti yang diharapkan.

Bisakah Anda memberi saran tentang cara terbaik untuk mencapai perilaku yang saya inginkan?

Saya telah melampirkan gif dari perilaku yang diharapkan.

Di bawah ini Anda dapat melihat bahwa tidak ada label yang menunjukkan nilai yang sama dan bagan tidak mencoba menempatkan label apa pun di antara label lain karena ada persyaratan bahwa label adalah nilai keseluruhan.

chart

Ah aku mengerti. Jika Anda memperbesar, katakanlah [3,4], rentangnya adalah [3,4] dan sumbu ingin menampilkan [3.0, 3.2, 3.4, 3.6, 3.8, 4.0], dan Anda tidak menginginkan digit pecahan, Apakah itu?

Sebenarnya tidak ada yang bisa saya lakukan ... karena data Anda cukup kecil, dan kami harus menampilkan 4-6 label di sana ... Bagaimana jika kisarannya [0,1], dan Anda perlu menampilkan 5 label, apa yang bisa Anda menampilkan selain angka pecahan?

Saya pikir tidak apa-apa untuk menampilkan angka pecahan jika rentangnya terlalu kecil, tetapi jika Anda benar-benar tidak menginginkannya, maka Anda dapat melakukannya seperti yang Anda lakukan. Atau Anda akan menerima hanya menampilkan label maks dan min yang disebut showOnlyMinMaxEnabled

BTW, tangkapan layar Anda berfungsi dengan baik, memecahkan masalah Anda

Ada juga beberapa properti untuk membantu Anda membatasi jumlah label. Anda dapat mencoba memodifikasi dan menyesuaikan untuk tingkat skala yang berbeda.

    public func setLabelCount(count: Int, force: Bool)
    {
        _labelCount = count

        if (_labelCount > 25)
        {
            _labelCount = 25
        }
        if (_labelCount < 2)
        {
            _labelCount = 2
        }

        forceLabelsEnabled = force
    }

Untuk memiliki perilaku yang sama pada sumbu Y perlu mengatur batas zoom Y. #382

388

@steprescott , apakah #388 menyelesaikan masalah Anda?

Dari melihat komit untuk masalah #388, satu-satunya perubahan adalah properti baru di viewport.

Bagaimana saya mendapatkan perilaku yang dimaksudkan yang ditampilkan di gif tetapi dengan perubahan Anda?

Hai @steprescott , coba dengan [_chartView.viewPortHandler setMaximumScaleY: 2.f]; misalnya, seperti ini perincian zoom tidak terlalu besar untuk menampilkan nilai berulang. Contoh yang baik adalah ketika Anda memiliki garis char horizontal tanpa batas, semua nilai Y diulang ketika zoom besar. Dengan MaximumScaleY pengulangan ini tidak terjadi.

Tanpa batas:
screen shot 2015-09-22 at 23 29 16

Dengan batas 2f:
screen shot 2015-09-22 at 23 30 07

Hai @noais

Itu berfungsi pada kumpulan data yang memiliki rentang nilai yang lebih besar tetapi jika Anda memiliki rentang nilai yang kecil, misalnya array nilai 0 - 7, memperbesar dengan faktor 2 berpotensi memberikan label duplikat.

Meskipun dengan membatasi faktor zoom telah memecahkan masalah Anda, dosis itu tidak menyelesaikan masalah pengulangan seluruh nilai.

Saya memang mendapatkan hasil yang diharapkan saat mengedit kelas ChartYAxisRenderer yang menunjuk ke commit a7e30dd16fbfaecb8e44c01ad8618a3a745fd101.

Ini dilakukan dengan melapisi nilai.

var interval = ChartUtils.roundToNextSignificant(number: Double(rawInterval))
if(_yAxis.valueFormatter?.maximumFractionDigits == 0)
{
    interval = interval < 1 ? 1 : floor(interval)
}

Meskipun ini berhasil (tetapi tidak ketika menggunakan HEAD repo ini) saya merasa bahwa kalian akan tahu tempat yang lebih baik dalam kerangka kerja Anda untuk menempatkan ini untuk memberikan hasil yang sama seperti yang ditunjukkan pada gif.

Mungkin properti allowRepeatingValues BOOL pada sumbu. Kalian akan lebih tahu.

Ya Anda benar ini adalah salah satu pekerjaan di sekitar. Biarkan saya mencoba melihat apakah mudah untuk membuat beberapa metode seperti allowRepeatingValues.

Itu akan sangat membantu, terima kasih.

Hai @noais dan @liuxuan30. Apakah Anda memiliki kesempatan untuk menyelidiki ini? Saya bisa mendapatkan efek yang diperlukan menggunakan kerangka kerja tetapi saya tidak tahu di mana sebaiknya properti ini berada dalam kerangka kerja dan jika ada cara yang lebih baik untuk mencapai hasil yang sama.

Terima kasih atas waktunya.

Saya masih berpikir itu karena formatter yang menghasilkan label duplikat dengan digit kecil, bukan algoritme. Jika Anda menghapus formatter, itu akan menampilkan nomor dengan benar, bukan?
Anda dapat menyelesaikannya dengan kode Anda, tetapi saya tidak yakin apakah itu bagus untuk semua orang.
@danielgindi bagaimana menurutmu?

Hai teman-teman, memilih allowRepeatingValues, saya memiliki angka kecil dan tidak ingin menampilkan nilai sumbu y yang digandakan

Ketika semua nilai saya nol, saya mendapatkan label sumbu berulang ini-
chart

Juga, saya perhatikan bahwa meskipun cuplikan kode yang saya miliki melakukan apa yang saya butuhkan, itu tidak menghapus nilai duplikat hanya dengan mengizinkan bilangan bulat. Jadi dengan memeriksa pemformat angka bukanlah cara yang buruk untuk menambahkan ini.

Apa yang tidak diizinkan oleh cuplikan itu adalah menghapus nilai yang digandakan, jadi jika nilainya adalah 1.1, 1.2, 1.2, 1.3 dan Anda ingin menyimpan satu digit desimal, itu tidak akan berfungsi. Kalian akan tahu tempat dan implementasi terbaik untuk fitur ini dan bagi orang-orang untuk menghabiskan waktu melihat masalah kerangka kerja saat ini dan bagi mereka untuk kemudian memilih, ini menunjukkan bahwa itu adalah opsi yang diinginkan orang lain juga.

allowRepeatingValues ​​:+1:

@noais @liuxuan30 Apakah Anda memiliki solusi yang lebih baik untuk ini daripada yang saya sarankan?

tidak, kecuali untuk allowRepeatingValues.. Karena masalah awal Anda adalah tentang pemformat. Anda tidak ingin angka desimal pada suatu level tetapi data Anda sebenarnya memiliki level berikutnya

Idealnya grafik tidak boleh menunjukkan nilai berulang, selamanya! Bisakah nilai berulang disembunyikan dengan beberapa logika, sehingga hanya menghasilkan nilai unik?

@vigyanhoon itu bukan 'mengulangi' nilai di belakang, itu adalah formatter yang menyebabkan nilai menjadi 'berulang'. Jika Anda tidak ingin mengulang, berikan formatter desimal yang bisa menyelesaikannya.

@ liuxuan30 Bisakah Anda menjelaskan apa yang Anda maksud dengan "_berikan formatter desimal_"? Dengan data saya, saya memberikan formatter yang mengatur maximumFractionDigits = 0 . Saya tidak yakin bagaimana mendapatkan hasil yang diharapkan dengan apa yang ada saat ini? Apakah Anda sudah bisa membuat grafik dengan kerangka seperti itu yang memberikan hasil yang sama dengan gif saya yang saya posting pada tanggal 28 Agustus?

Apakah Anda bermaksud menggunakan numberFormatter.allowsFloats = NO, jika ya, itu tidak membantu saya, saya masih melihat INT duplikat?! Satu-satunya cara saya berhasil TIDAK menampilkan nilai berulang adalah dengan menggunakan 2 label pada xAxis (atas/bawah)

@steprescott maaf kalau kurang jelas. MaximumFractionDigits tidak boleh 0, jika tidak maka hanya akan menampilkan bagian integer. Saya memang menemui masalah serupa, jika rentang datanya kecil dan diperlukan 5~6 label, memberikan maximumFractionDigits = 0 akan memiliki nilai berulang. Tidak ada cara mudah untuk memperbaikinya, saya kira. pikirkan apakah rentang datanya [0,2], dan saya harus menampilkan 5 label: 0, 0.4,0.8,1.2,1.6, 2.0. Jika kita menerapkan maximumFractionDigits = 0, mungkin 0, 0, 1, 1, 2, 2

@injectios , bagaimana dengan MaximumFractionDigits = 2 atau bahkan 4?

Hai semuanya!
Saya mengalami masalah yang sama.

@ liuxuan30 tergantung pada jenis data, tidak masuk akal untuk memiliki desimal. Seperti bagan manusia, Anda tidak akan pernah memiliki 1,5 manusia, baik 1 atau 2.

@jpros Anda mendapat poin, tetapi dari poin matematika, kami tidak dapat memiliki 4 label tanpa desimal dalam rentang [0,2].

Jadi, aktifkan yAxis.showOnlyMinMaxEnabled untuk menghindari nilai berulang sebagai solusi untuk saat ini,
Atau Anda menerapkan logika Anda untuk menghitung nilai Anda sendiri di ChartYAxisRenderer.computeAxis untuk menghindari,
Atau kita harus menunggu fitur 'allowRepeatValues'

@PhilJay apakah kami punya solusi untuk itu saat ini? :-)

Dari POV Android (dan ofc iOS), baris ini di sini: https://github.com/PhilJay/MPAndroidChart/blob/master/MPChartLib/src/com/github/mikephil/charting/renderer/YAxisRenderer.java#L108

Bisa menjadi lokasi untuk mengatasi masalah ini. Ada float interval dari label sumbu yang dihitung, dan dapat menggunakannya untuk mencegah perubahan lebih lanjut pada label jika dua label akan diformat sama.
Itulah yang muncul di benak saya ketika memikirkannya dengan cepat. Bagaimana menurutmu?

Saya menyingkirkan duplikasi dengan menetapkan nilai maksimal

leftAxis.customAxisMax = maxYLabelCount

@vigyanhoon itu hal yang sama sekali berbeda, nilainya bisa jutaan, sedangkan maxYLabelCount tidak bisa. customAxisMax adalah untuk menentukan nilai maksimal rentang sumbu.

+1 untuk menyelesaikan masalah rendering. Saya juga memiliki grafik orang, dan saya memiliki [0, 0, 1, 1, 2, 2]. Menyetel numberFormatter.maximumFractionDigits ke apa pun selain 0 tidak masuk akal.

Kode berikut yang disarankan oleh @steprescott diperbaiki untuk saya juga. Saya menambahkannya di garpu saya di sini:

https://github.com/natanrolnik/ios-charts/commit/01df4d9264e0adbef4db88763075376f4a0f255c

Apakah seorang PR dapat menyelesaikan masalah ini? Bagaimana menurutmu @danielgindi @liuxuan30 @steprescott ? Apakah ada kasus yang tidak diperbaiki oleh kode ini? Jika demikian, apa solusi yang lebih baik?

@natanrolnik bagaimana jika pengguna memperbesar dan rentang menjadi [25.2, 25.3]? Intervalnya adalah 1,0 padahal seharusnya, katakanlah 0,02.
Ini akan membantu jika pengguna secara khusus menetapkan angka pecahan maksimum ke 0, kami membatasi intervalnya. Saya tidak menguji nilai negatif.
Kami belum memiliki solusi yang lebih baik, tetapi saya kira fitur seperti 'allowRepeatValues' adalah yang dapat kami pikirkan?

Saya setuju tentang allowRepeatedValues !

Saya pikir @steprescott adalah solusi yang baik. Hanya perlu menyesuaikan nilai satu dengan variabel granularity.

Dengan masalah @liuxuan30 ini tidak ada lagi.

Jika kita meletakkan kode ini pada baris 75 di ChartYAxisRenderer:

interval = interval < granuality ? granuality : interval       

https://github.com/noais/ios-charts/compare/master...Noais
Bagaimana menurutmu?

Oke, jadi ini sekarang ditutup tetapi tidak digabung menjadi master. Kapan kemungkinan ini akan terjadi?

Ini dirilis di 2.2.4, sebagai fitur granularity

Saya tidak yakin apakah saya harus memposting masalah ini di sini tetapi itu masuk akal bagi saya.

Saya memiliki masalah yang sangat mirip dengan label xAxis saya. Saya memiliki IAxisValueFormatter khusus yang mengembalikan string untuk waktu, memberikan jam seperti ini "22:00", "23:00" untuk beberapa grafik, hari minggu seperti ini "Senin.", "Kamis." untuk orang lain dll..

Ketika grafik diperbesar terlalu banyak, nilainya mulai menduplikasi seperti yang ditunjukkan di sini:

Screenshot 2019-07-19 at 17 59 11

Dalam hal ini fitur granularity tidak berfungsi karena berfungsi dengan perbedaan antar angka.

Apakah Anda punya ide tentang bagaimana saya bisa menghentikan label-label itu berulang?

Terima kasih

Setel granularityEnabled ke pekerjaan palsu untuk saya
leftAxis.granularityEnabled = true

Halo teman-teman, saya ingin membuat nilai xAxis tidak berulang saat memperbesar
Pemformat saya:
func stringForValue(_ nilai: Ganda, sumbu: AxisBase?) -> String {
biarkan tanggal = Tanggal(timeInterval Since1970: nilai)
tanggal kembali.formattedString(withDateFormat: .daymonth)
}
saya juga menggunakan granularity, tetapi saya masih memiliki masalah yang sama
xAxis.granularity = 1.0
xAxis.granularityEnabled = true

bisa ada yang tahu bagaimana menyelesaikannya plz?

@Aaimek
saya memiliki masalah yang sama, apakah Anda menemukan solusinya?

Saya memiliki masalah yang sama ketika saya memaksa jumlah label sumbu x, dan memplot beberapa poin.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

kwstasna picture kwstasna  ·  3Komentar

guoyutaog picture guoyutaog  ·  3Komentar

BrandonShega picture BrandonShega  ·  4Komentar

guanyanlin picture guanyanlin  ·  3Komentar

brytnvmg picture brytnvmg  ·  4Komentar