matplotlib 当使用usetex=True时,将轴刻度标签设为粗体

evrscar2  于 2023-11-22  发布在  其他
关注(0)|答案(6)|浏览(191)

我想在我的轴上有粗体标签,这样我就可以使用图进行发布。我还需要用粗体绘制图例中的线的标签。到目前为止,我可以将轴标签和图例设置为我想要的大小和权重。我也可以将轴标签的大小设置为我想要的大小,但是我无法设置权重。
下面是一个示例代码:

  1. # plotting libs
  2. from pylab import *
  3. from matplotlib import rc
  4. if __name__=='__main__':
  5. tmpData = np.random.random( 100 )
  6. # activate latex text rendering
  7. rc('text', usetex=True)
  8. rc('axes', linewidth=2)
  9. rc('font', weight='bold')
  10. #create figure
  11. f = figure(figsize=(10,10))
  12. ax = gca()
  13. plot(np.arange(100), tmpData, label=r'\textbf{Line 1}', linewidth=2)
  14. ylabel(r'\textbf{Y-AXIS}', fontsize=20)
  15. xlabel(r'\textbf{X-AXIS}', fontsize=20)
  16. fontsize = 20
  17. fontweight = 'bold'
  18. fontproperties = {'family':'sans-serif','sans-serif':['Helvetica'],'weight' : fontweight, 'size' : fontsize}
  19. ax.set_xticklabels(ax.get_xticks(), fontproperties)
  20. ax.set_yticklabels(ax.get_yticks(), fontproperties)
  21. for tick in ax.xaxis.get_major_ticks():
  22. tick.label1.set_fontsize(fontsize)
  23. for tick in ax.yaxis.get_major_ticks():
  24. tick.label1.set_fontsize(fontsize)
  25. legend()
  26. show()
  27. sys.exit()

字符串
这就是我得到的


的数据
任何想法,我错过了什么或做错了,以获得轴蜱标签在粗体?

编辑

我已经更新了我的代码,使用了datetime响应。然而,我现在有另一个问题,因为我需要在x轴上使用datetime,这与正常的y轴上的效果不同(抱歉没有在原始问题中使用它,但我不认为它会改变事情):

  1. # plotting libs
  2. from pylab import *
  3. from matplotlib import rc, rcParams
  4. import matplotlib.dates as dates
  5. # datetime
  6. import datetime
  7. if __name__=='__main__':
  8. tmpData = np.random.random( 100 )
  9. base = datetime.datetime(2000, 1, 1)
  10. arr = np.array([base + datetime.timedelta(days=i) for i in xrange(100)])
  11. # activate latex text rendering
  12. rc('text', usetex=True)
  13. rc('axes', linewidth=2)
  14. rc('font', weight='bold')
  15. rcParams['text.latex.preamble'] = [r'\usepackage{sfmath} \boldmath']
  16. #create figure
  17. f = figure(figsize=(10,10))
  18. ax = gca()
  19. plot(np.arange(100), tmpData, label=r'\textbf{Line 1}', linewidth=2)
  20. ylabel(r'\textbf{Y-AXIS}', fontsize=20)
  21. xlabel(r'\textbf{X-AXIS}', fontsize=20)
  22. ax.xaxis.set_tick_params(labelsize=20)
  23. ax.yaxis.set_tick_params(labelsize=20)
  24. ax.xaxis.set_major_formatter(dates.DateFormatter('%m/%Y'))
  25. ax.xaxis.set_major_locator(dates.MonthLocator(interval=1))
  26. legend()


现在我的结果看起来像这样:



这些更改似乎不会影响显示,也不会影响x轴刻度标签的权重。

k2fxgqgv

k2fxgqgv1#

使用

  1. plt.xticks(x, weight = 'bold')

字符串

7lrncoxx

7lrncoxx2#

我认为问题是因为刻度是在LaTeX数学模式下制作的,所以字体属性不适用。
您可以通过使用rcParams将正确的命令添加到LaTeX前导中来解决这个问题。具体来说,您需要使用\boldmath来获得正确的权重,并使用\usepackage{sfmath}来获得sans-serif字体。
此外,您可以使用set_tick_params设置刻度标签的字体大小。

python 3.12.0matplotlib 3.8.0中测试

数字xticklabels

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. tmpData = np.random.random( 100 )
  4. # activate latex text rendering
  5. plt.rc('text', usetex=True)
  6. plt.rc('axes', linewidth=2)
  7. plt.rc('font', weight='bold')
  8. plt.rcParams['text.latex.preamble'] = r'\usepackage{sfmath} \boldmath'
  9. #create figure
  10. f = plt.figure(figsize=(10,10))
  11. ax = plt.gca()
  12. plt.plot(np.arange(100), tmpData, label=r'\textbf{Line 1}', linewidth=2)
  13. plt.ylabel(r'\textbf{Y-AXIS}', fontsize=20)
  14. plt.xlabel(r'\textbf{X-AXIS}', fontsize=20)
  15. ax.xaxis.set_tick_params(labelsize=20)
  16. ax.yaxis.set_tick_params(labelsize=20)
  17. plt.legend()

字符串
x1c 0d1x的数据

日期时间xticklabels

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. from datetime import datetime, timedelta
  4. tmpData = np.random.random(100)
  5. base = datetime(2000, 1, 1)
  6. arr = np.array([base + timedelta(days=i) for i in range(100)])
  7. # activate latex text rendering
  8. plt.rc('text', usetex=True)
  9. plt.rc('axes', linewidth=2)
  10. plt.rc('font', weight='bold')
  11. plt.rcParams['text.latex.preamble'] = r'\usepackage{sfmath} \boldmath'
  12. # create figure
  13. f = plt.figure(figsize=(10, 10))
  14. ax = plt.gca()
  15. plt.plot(arr, tmpData, label=r'\textbf{Line 1}', linewidth=2)
  16. plt.ylabel(r'\textbf{Y-AXIS}', fontsize=20)
  17. plt.xlabel(r'\textbf{X-AXIS}', fontsize=20)
  18. ax.xaxis.set_tick_params(labelsize=20)
  19. ax.yaxis.set_tick_params(labelsize=20)
  20. # Set x-axis major formatter and locator
  21. ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%Y'))
  22. ax.xaxis.set_major_locator(mdates.MonthLocator(interval=1))
  23. plt.legend()


展开查看全部
ff29svar

ff29svar3#

  1. labels = axes.get_xticklabels() + axes.get_yticklabels()
  2. [label.set_fontweight('bold') for label in labels]

字符串

mbskvtky

mbskvtky4#

  • 鉴于OP中的原始问题,其中x和y轴刻度和标签是数字。
  • [fr'\textbf{{{v}}}' for v in ax.get_xticks()]使用3组{},因为也使用了f字符串。
  • 如果只使用{}fr'\textbf{v}',则只有第一个字符将是粗体。
  • 下面的代码使用了显式的Axes接口。如果使用了隐式的pyplot接口,那么在plot调用之后,用ax = plt.gca()获取Axes
    *python 3.12.0matplotlib 3.8.0中测试
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. data = np.random.random(100)
  4. # activate latex text rendering
  5. plt.rc('text', usetex=True)
  6. plt.rc('axes', linewidth=2)
  7. plt.rc('font', weight='bold')
  8. # create figure and Axes
  9. fig, ax = plt.subplots(figsize=(10, 10))
  10. ax.plot(np.arange(100), data, label=r'\textbf{Line 1}', linewidth=2)
  11. # Set the axis labels to bold and increase the fontsize
  12. ax.set_ylabel(r'\textbf{Y-AXIS}', fontsize=20)
  13. ax.set_xlabel(r'\textbf{X-AXIS}', fontsize=20)
  14. # change the tick labels to bold
  15. ax.set_xticks(ax.get_xticks(), [fr'\textbf{{{v}}}' for v in ax.get_xticks()], fontsize=20)
  16. _ = ax.set_yticks(ax.get_yticks(), [fr'\textbf{{{round(v, 1)}}}' for v in ax.get_yticks()], fontsize=20)

字符串


的数据

展开查看全部
yyyllmsg

yyyllmsg5#

如果你想让轴标签自动加粗(即不必每次都添加\textbf),你可以执行以下操作

  1. from matplotlib.axes import Axes
  2. from matplotlib import pyplot as plt
  3. plt.rcParams['text.usetex'] = True
  4. def get_new_func(axis_name): # returns a modified version of the Axes.set_xlabel (or y) methods
  5. orig_func = getattr(Axes, f'set_{axis_name}label')
  6. def add_bold(self, *args, **kwargs):
  7. new_args = list(args)
  8. new_args[0] = fr"\textbf{{{new_args[0]}}}" # modify the argument
  9. return orig_func(self, *new_args, **kwargs)
  10. return add_bold
  11. for x in ['x', 'y']:
  12. setattr(Axes, f'set_{x}label', get_new_func(x)) # modify the methods of the Axis class
  13. x = np.linspace(0, 2 * 3.14, 20)
  14. y = np.sin(x)
  15. ax = plt.gca()
  16. ax.plot(x, y)
  17. ax.set_xlabel("Theta")
  18. ax.set_ylabel("Amp")
  19. plt.show()

字符串
这利用了Axis.set_xlabelAxis.set_ylabel方法是属性的事实(在本例中是函数对象),可以由用户修改。修改在add_bold中完成,orig_funcadd_bold是在get_new_func内部定义的,以便正确地保留对原始方法(即,我正在形成一个闭包)。

展开查看全部
hmtdttj4

hmtdttj46#

这是另一个例子

  1. import matplotlib.pyplot as plt
  2. places = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
  3. literacy_rate = [100, 98, 90, 85, 75, 50, 30, 45, 65, 70]
  4. female_literacy = [95, 100, 50, 60, 85, 80, 75, 99, 70, 30]
  5. plt.xlabel("Places")
  6. plt.ylabel("Percentage")
  7. plt.plot(places, literacy_rate, color='blue',
  8. linewidth=6, label="Literacy rate")
  9. plt.plot(places, female_literacy, color='fuchsia',
  10. linewidth=4, label="Female Literacy rate")
  11. plt.legend(loc='lower left', ncol=1)

字符串
youtput就像这样:


的数据

展开查看全部

相关问题