Как добавить разноцветную линию к графику панд с определенной картой цветов - PullRequest
0 голосов
/ 24 января 2019

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

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import seaborn as sns
import matplotlib.ticker as ticker

plt.style.use('ggplot')
data = pd.DataFrame(data=[[1, 0.0, 10],[87, 32, 161],[821, 271, 804],[246, 922, 819],[107, 785, 1697]], columns=['A', 'B', 'C'])
data_cost = pd.DataFrame(index=[2001, 2002, 2003, 2004, 2005], data=[[4],[311],[671],[862], [593]], columns=['D'])
my_cmap = ListedColormap(sns.color_palette("GnBu_d", 3).as_hex())
ax = data.plot(colormap=my_cmap, alpha=0.8, rot=0, xticks=data.index,
               linewidth=6, ylim=(-0.5, 20), ax=ax)
ax = data.plot(colormap=my_cmap, rot=0, xticks=data.index, marker='s', ms=15, linewidth=6, ylim=(-0.5, 13), ax=ax)
ax = data_cost.plot(color='r', rot=0, xticks=data_cost.index,
                    linewidth=6, ylim=(1000, 5000), marker='s', ms=15, ax=ax)
ax.set_ylabel('I', fontsize=40)
ax.xaxis.set_tick_params(labelsize=40)
ax.set_xlabel('Y', fontsize=40)
ax.yaxis.set_tick_params(labelsize=40)
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=40, prop={'size':32})
ax.set_facecolor('none')
plt.show()

К сожалению, это, похоже, не работает. Если я уберу топор на графиках, он будет выглядеть лучше. Но как мне этого добиться? В конце я хотел бы получить следующий график, где читается только одна строка:

enter image description here

с D в виде красной кривой.

1 Ответ

0 голосов
/ 24 января 2019

Кажется, с вашим кодом довольно много проблем.Ниже приведена моя отредактированная версия, которая должна приблизить сюжет к тому, что вы публикуете в своем вопросе.Я предполагаю, что самой большой проблемой были противоречивые ylim аргументы в командах заговора и отсутствующий индекс в «данных» Dataframe.Обратите внимание, что fontsize=40 значительно увеличивает размер текста, поэтому я закомментировал его.Если это все равно желательно, попробуйте поэкспериментировать оттуда.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import seaborn as sns
import matplotlib.ticker as ticker

fig, ax = plt.subplots()

plt.style.use('ggplot')
data = pd.DataFrame(index=[2001, 2002, 2003, 2004, 2005], data=[[1, 0.0, 10],[87, 32, 161],[821, 271, 804],[246, 922, 819],[107, 785, 1697]], columns=['A', 'B', 'C'])
data_cost = pd.DataFrame(index=[2001, 2002, 2003, 2004, 2005], data=[[4],[311],[671],[862], [593]], columns=['D'])
my_cmap = ListedColormap(sns.color_palette("GnBu_d", 3).as_hex())
##ax = data.plot(colormap=my_cmap, alpha=0.8, rot=0, xticks=data.index,
##               linewidth=6,
##               #ylim=(-0.5, 20),
##               ax=ax)
ax = data.plot(colormap=my_cmap, rot=0, xticks=data.index,
               marker='s', ms=15, linewidth=6,
               #ylim=(-0.5, 13),
               ax=ax
               )
ax = data_cost.plot(color='r', rot=0, xticks=data_cost.index,
                    linewidth=6,
                    #ylim=(1000, 5000),
                    marker='s', ms=15, ax=ax)
ax.set_ylabel('I')#, fontsize=40)
ax.xaxis.set_tick_params()#labelsize=40)
ax.set_xlabel('Y')#, fontsize=40)
ax.yaxis.set_tick_params()#labelsize=40)
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
ax.legend(
    loc='center left', bbox_to_anchor=(1, 0.5),
    #fontsize=40,
    prop={'size':32})
ax.set_facecolor('none')
#plt.show()
fig.savefig('example.png', bbox_inches='tight')

Окончательная цифра выглядит так:

result of the above code

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