Charts: Prise en charge des axes nommés?

Créé le 18 avr. 2015  ·  36Commentaires  ·  Source: danielgindi/Charts

2015-04-19 00-48-45 lifts rimmer sk last -1

Regardé le wiki Android, mais n'a pas trouvé la possibilité de nommer l'axe x ou y.

Est-ce possible?

feature help wanted ★★★

Commentaire le plus utile

Je viens de rencontrer cela aussi. C'est dommage que cette demande de fonctionnalité soit ouverte depuis environ 4 ans maintenant. Pour l'implémenter, j'ai écrit mon propre moteur de rendu personnalisé sur l'axe y. Pour accomplir un tel titre sur l'axe gauche, vous pouvez faire quelque chose comme ceci:

Dans votre configuration graphique:

leftAxis.xOffset = 45
leftYAxisRenderer = MyYAxisRenderer(viewPortHandler: viewPortHandler, yAxis: leftAxis, transformer: getTransformer(forAxis: .left))

Et créez votre moteur de rendu personnalisé:

class MyYAxisRenderer: YAxisRenderer {
    private static let titleLabelPadding: CGFloat = 20

    /**
     Unfortunately iOS Charts has marked many of its methods with internal visibily
     so they cannot be customized. Instead you often need to re-implement logic from
     the charting framework.
    */
    override func renderAxisLabels(context: CGContext) {
        // Render the y-labels.
        super.renderAxisLabels(context: context)

        // Render the y-axis title using our custom renderer.
        renderTitle(title: "Lorem ipsum dolor sit amet", inContext: context, x: MyYAxisRenderer.titleLabelPadding)
    }
}

// MARK: Y-Axis titles.
private extension MyYAxisRenderer {
    func renderTitle(title: String, inContext context: CGContext, x: CGFloat) {
        guard let yAxis = self.axis as? YAxis else { return }

        let attributes: [NSAttributedString.Key: Any] = [
            .font: yAxis.labelFont,
            .foregroundColor: yAxis.labelTextColor
        ]

        // Determine the chart title's y-position.
        let titleSize = title.size(withAttributes: attributes)
        let verticalTitleSize = CGSize(width: titleSize.height, height: titleSize.width)
        let point = CGPoint(x: x, y: (viewPortHandler.chartHeight - verticalTitleSize.height) / 2)

        // Render the chart title.
        ChartUtils.drawText(context: context,
                            text: title,
                            point: point,
                            attributes: attributes,
                            anchor: .zero,
                            angleRadians: .pi / -2)
    }
}

Cet exemple rendra le titre de l'axe y avec un décalage / remplissage à gauche de 20px et les étiquettes de l'axe y avec un décalage à gauche de 45px.

J'espère que cela aidera certaines personnes...

Tous les 36 commentaires

Tout ce qui est pris en charge dans la version Android est pris en charge ici avec exactement la même API!

@danielgindi Je comprends cela et j'ai déjà lu la documentation, mais j'ai peut-être manqué quelque chose, connaissez-vous la réponse à ma question?

Eh bien, actuellement, il n'est pas implémenté - je ne prévois pas actuellement de l'implémenter, vous pouvez donc le faire :-)
Ou vous pouvez le demander sur le repo MPAndroidChart et quand c'est fait, je le tirerai ici aussi

+1, Ce serait génial et une fonctionnalité importante - nous avons tous appris depuis l'école primaire à titrer nos axes! :)

c'est possible. Je l'ai fait avant. similaire à la rotation des étiquettes de l'axe x. Le point entier calcule le point d'ancrage correct pour la rotation.

Je pourrais faire un PR, mais la question est, ce que j'ai fait est simplement une rotation de 90 et centré au milieu de l'axe y avec un texte simple et une couleur de texte, une police. Une fois que nous le soutenons officiellement, les gens demanderaient plus, comme un angle différent, une position, plusieurs lignes, etc.

Je ne suis pas tout à fait votre explication, car il n'y a pas de propriété d'étiquette d'axe à laquelle appliquer la rotation et le centrage. Voulez-vous simplement dire que vous avez ajouté manuellement une étiquette à la vue graphique et que vous lui avez appliqué manuellement certaines transformations?

Respectueusement, je suggère que même les étiquettes d'axes de base seraient un énorme avantage et que vous ne seriez pas obligé de prendre en charge plus de fonctionnalités que vous ne le souhaitez (après tout, vous ne prévoyez actuellement pas de prendre en charge celle-ci). J'espère que vous reconsidérerez!

@UberJason Je veux dire que j'ai sous-classé la classe d'axes et appliqué une propriété axisName et fait une rotation des orteils. La plupart des travaux personnalisés pourraient utiliser la sous-classe + le remplacement pour atteindre.

Je suis en vacances .. donc je peux vérifier mon ancien code et déposer un PR pour la v3.

+1 J'adorerais voir cette fonctionnalité

+1 J'adorerais voir cette fonctionnalité

+1 J'adorerais voir cette fonctionnalité

+1 J'adorerais voir cette fonctionnalité

est-ce mis en œuvre?

+1 J'adorerais voir cette fonctionnalité

+1

Existe-t-il un moyen d'obtenir une position de cadre que l'on pourrait utiliser pour insérer un UIView personnalisé?

+1 aimerait voir cette fonctionnalité

est-ce mis en œuvre? j'ai besoin de ça.

Il y a un PR # 2387, mais pas encore revu.

+1 aimerait voir cette fonctionnalité

+1 aimerait voir cette fonctionnalité

+1 aimerait voir cette fonctionnalité. .....

+1 aimerait voir cette fonctionnalité

+1 cette fonctionnalité serait géniale !!

+1

regardez # 2452 et # 2387

+1 aimerait voir cette fonctionnalité

+1 moi aussi

Pourrait vraiment utiliser cette fonctionnalité ...

Je veux aussi cette fonctionnalité.

En attendant ...

Moi aussi............

Je veux aussi cette fonctionnalité.

Je veux aussi cette fonctionnalité .. Je suis fatigué pour chaque mise à jour de la réécriture

J'ai vu beaucoup de discussions sur l'ajout de titres d'axes sur plusieurs threads, mais je n'ai toujours pas trouvé d'exemple de code sur la façon de les ajouter. J'utilise Swift 4.2. Mon graphique fonctionne très bien, sauf que je ne parviens pas à afficher les titres des axes. Quelqu'un a-t-il un exemple de code?

Je viens de rencontrer cela aussi. C'est dommage que cette demande de fonctionnalité soit ouverte depuis environ 4 ans maintenant. Pour l'implémenter, j'ai écrit mon propre moteur de rendu personnalisé sur l'axe y. Pour accomplir un tel titre sur l'axe gauche, vous pouvez faire quelque chose comme ceci:

Dans votre configuration graphique:

leftAxis.xOffset = 45
leftYAxisRenderer = MyYAxisRenderer(viewPortHandler: viewPortHandler, yAxis: leftAxis, transformer: getTransformer(forAxis: .left))

Et créez votre moteur de rendu personnalisé:

class MyYAxisRenderer: YAxisRenderer {
    private static let titleLabelPadding: CGFloat = 20

    /**
     Unfortunately iOS Charts has marked many of its methods with internal visibily
     so they cannot be customized. Instead you often need to re-implement logic from
     the charting framework.
    */
    override func renderAxisLabels(context: CGContext) {
        // Render the y-labels.
        super.renderAxisLabels(context: context)

        // Render the y-axis title using our custom renderer.
        renderTitle(title: "Lorem ipsum dolor sit amet", inContext: context, x: MyYAxisRenderer.titleLabelPadding)
    }
}

// MARK: Y-Axis titles.
private extension MyYAxisRenderer {
    func renderTitle(title: String, inContext context: CGContext, x: CGFloat) {
        guard let yAxis = self.axis as? YAxis else { return }

        let attributes: [NSAttributedString.Key: Any] = [
            .font: yAxis.labelFont,
            .foregroundColor: yAxis.labelTextColor
        ]

        // Determine the chart title's y-position.
        let titleSize = title.size(withAttributes: attributes)
        let verticalTitleSize = CGSize(width: titleSize.height, height: titleSize.width)
        let point = CGPoint(x: x, y: (viewPortHandler.chartHeight - verticalTitleSize.height) / 2)

        // Render the chart title.
        ChartUtils.drawText(context: context,
                            text: title,
                            point: point,
                            attributes: attributes,
                            anchor: .zero,
                            angleRadians: .pi / -2)
    }
}

Cet exemple rendra le titre de l'axe y avec un décalage / remplissage à gauche de 20px et les étiquettes de l'axe y avec un décalage à gauche de 45px.

J'espère que cela aidera certaines personnes...

Essayer une solution de contournement plus simple en utilisant SwiftUI:
https://github.com/danielgindi/Charts/issues/4405

Cette page vous a été utile?
0 / 5 - 0 notes