如何在 matplotlib 条形图上旋转 x 轴刻度标签?尝试了几种方法,都没有奏效

Posted

技术标签:

【中文标题】如何在 matplotlib 条形图上旋转 x 轴刻度标签?尝试了几种方法,都没有奏效【英文标题】:How to rotate x-axis tick labels on matplotlib bar chart? Tried several approaches, none worked 【发布时间】:2019-12-14 10:55:46 【问题描述】:

我无法旋转 matplotlib 条形图上的 x 刻度标签,因此这些标签当前重叠。我已经阅读了一些 matplotlib 文档以及其他阅读,并尝试了不同的方法,但都没有奏效。根据我对所读内容的理解,似乎有不止一种方法可以使用 matplotlib 实现条形图,而且我不能在所有条形图上旋转刻度标签,只能在以某种方式制作的条形图上旋转。那准确吗?有没有办法在我的条形图上进行 x 轴刻度标签旋转?

(快速概述我正在尝试做的事情:我正在制作一个包含条形图的 Web 应用程序。我正在处理的条形图应该在 x- 上显示癌症药物副作用的名称轴,以及 y 轴上每种副作用的发生百分比。副作用标签很长,因此它们重叠,这就是我尝试旋转它们的原因。)

这里是python代码:

import os
import matplotlib.pyplot as plt
import numpy as np
import mpld3
from matplotlib import *
from cs50 import SQL
from flask import Flask, flash, jsonify, redirect, render_template, 
request, session
from flask_session import Session
from tempfile import mkdtemp
from werkzeug.exceptions import default_exceptions, HTTPException, 
InternalServerError
import sqlite3


app = Flask(__name__)

app.config["TEMPLATES_AUTO_RELOAD"] = True

app.config["SESSION_FILE_DIR"] = mkdtemp()
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)

db = SQL("sqlite:///cancermeds.db")

@app.route("/", methods=["GET", "POST"])
def index():
    if request.method=="POST":

        selection = request.form.get("cancerlist")
        if selection == "breast cancer":
            rows = db.execute("SELECT * FROM 'breast cancer'")
            for row in rows:
                keys = list(row.keys())
                del keys[16:19]
                print(keys)
                values = list(row.values())
                del values[16:19]
                print(values)

                positions = 
   [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]

                fig, ax = plt.subplots()
                fig = plt.figure(figsize=(7,6))
                ax = plt.bar(keys, values, width=0.5)

                plt.xlabel("Side Effects")
                plt.xticks(positions, keys)
                plt.xticks(rotation=60)
                plt.ylabel("Percentages of Occurence of Side 
Effects")
                plt.title("Bar Chart showing Side Effects of Breast 
Cancer Medication(s) With Their Corrresponding Percentages Of 
Occurence")

                fig = ax[0].figure
                bar_chart = mpld3.fig_to_html(fig)

        return render_template("breastcancer.html", bar_chart = bar_chart)

    else:
        return render_template("index.html")


if __name__ == '__main__':
    app.run(debug=True)

plt.xticks(rotation=60) 线用于将 x 轴刻度标签旋转 60 度(我只是选择了 60 度,这个确切数字没有具体原因)。然而,标签根本不旋转,但奇怪的是名为“副作用”的 x 轴标签消失了。当我删除 plt.xticks(rotation=60) 行时,“副作用”标签会重新出现在它的位置。

感谢您的帮助。

【问题讨论】:

您需要创建一个minimal reproducible example,以便人们可以运行您的代码。此外,您还需要说明您关心的输出是来自 matplotlib 还是来自 mpld3。 【参考方案1】:

您有几个选择。您可以在设置 xticklabels 或使用 tick_params 时执行此操作。

fig = pl.figure(figsize=(5, 5))
ax0 = fig.add_subplot(111)

ax0.bar(x, height=2)

ax0.set_xticklabels(yourLabels, rotation=60)

# alternatively
ax0.tick_params(rotation=60)

当然,你必须指定你的刻度标签应该是什么。

顺便说一句,我不会像你那样制作我的数字(如你在示例中看到的那样),这可能会或可能不会影响你如何改变你的数字。

【讨论】:

我会尝试使用您的答案,看看情况如何。谢谢! 我无法成功地将这种制作数字的方法合并到我的代码中。我只是不明白。您是否推荐任何可以帮助指导我从制作图形到将图形转换为 html 的阶段,以便能够在网页上显示条形图的特定阅读材料?谢谢。 @JohnAbdelmalek 我想我没有看到这个问题。也许如果您回答 ImportanceOfBeingErnest 的问题并提供 MWE,您可以获得更多帮助。

以上是关于如何在 matplotlib 条形图上旋转 x 轴刻度标签?尝试了几种方法,都没有奏效的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 nvd3 在柱形图上定位旋转的 x 轴标签?

在条形图上的 Plotly 中更改轴/图例名称

s-s-rS:在条形图上定义自定义 X 轴位置

matplotlib:在条形图上绘制多列熊猫数据框

python使用matplotlib绘制水平条形图并在条形图上添加实际数值标签实战

如何在 matplotlib 中将列指定为轴并绘制条形图?