Как отформатировать значения через запятую в таблице matplotlib с прикрепленной диаграммой? - PullRequest
1 голос
/ 29 марта 2019

У меня есть фрейм данных pandas, в котором я использовал функцию pandas.plot для построения гистограммы. В функции я установил табличную функцию на. Как мне отформатировать значения в этой сопровождающей таблице с разделителями-запятыми?

Я могу сделать это для значений осей, но не в сопровождающей таблице

Я уже пытался преобразовать значения в число с плавающей точкой, но pandas plot отображает только целые числа и поэтому выдает ошибку «Пустой кадр данных»: нет числовых данных для построения графика.

ax1 = mydf.plot (kind = 'bar', title = диаграмма с таблицей, размер шрифта = 8, ширина = 0.75, легенда = True, таблица = True)

ax1.legend(loc=5, bbox_to_anchor=(1.25,0.5), fontsize='x-small')

ax1.axes.get_xaxis().set_visible(False)

ax1.get_yaxis().get_major_formatter().set_scientific(False)

ax1.get_yaxis().set_major_formatter(ticker.StrMethodFormatter('${x:,.0f}'))

ax1.set_ylim(-10000000,10000000)

ax1.set_ylabel("P&L",fontsize=9)

ax1.axhline(0,0,1, color='k', linewidth=0.5)

table_ax1 = ax1.tables[0]

table_ax1.auto_set_font_size(False)

table_ax1.set_fontsize('8')

table_ax1.scale(1,2)

plt.tight_layout()

1 Ответ

1 голос
/ 30 марта 2019

Я не знаю, как можно заранее форсировать это форматирование в таблице, если вы сами не создадите таблицу matplotlib самостоятельно, однако вы можете перебирать содержимое таблицы и конвертировать их таким образом ( если вам нужно использовать реализацию панд). Я добавил сюда код из этого связанного вопроса , демонстрирующего, как можно манипулировать таблицей.

import pandas as pd
import matplotlib.pyplot as plt

fig, ax = plt.subplots(1,1, figsize = (5,5))
df= pd.DataFrame({'City': ['LA', 'SF', 'Dallas'],
 'Lakes': [10000, 90000, 600000], # lets set some that can be comma formatted
 'Rivers': [1, 0, 0],
 'State': ['CA', 'CA', 'TX'],
 'Waterfalls': [200500, 450000, 50000]})



myplot = df.plot(x=['City','State'],kind='bar',stacked='True',table=True, ax =ax)

### you can also scale and change the table
### see https://stackoverflow.com/questions/39668665/format-a-table-that-was-added-to-a-plot-using-pandas-dataframe-plot
myplot.axes.get_xaxis().set_visible(False)
# Getting the table created by pandas and matplotlib
table = myplot.tables[0]
# Setting the font size
table.set_fontsize(12)
# Rescaling the rows to be more readable
table.scale(1,2)


## to format the table values I will retrieve them and change them when they aren't text labels
xtls = ax.get_xticklabels()
xtls = [i.get_text() for i in xtls]

ax.set_xticklabels([])

t = ax.tables[0]
for c in t.get_children():
    tobj = c.get_text()
    text = tobj.get_text()
    if text not in xtls:
        try: # some texts will be strings that are labels, we can't convert them
            s = '{:0,d}'.format(int(text))
            tobj.set_text(s)
        except:
            pass

result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...