Python - Как правильно выровнять линейчатые графики и линейные? - PullRequest
0 голосов
/ 02 декабря 2019

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

attacks = 5

idealdata = fullMatrix(attacks, .5)
actualdata = trueDataM(attacks, 'crit_50')
fig, axs = plt.subplots(attacks+1, sharex=True, sharey=True)
axs2 = [ax.twinx() for ax in axs]

fig.text(0.5, 0.04, 'State', ha='center')
fig.text(0.04, 0.5, 'Probability', va='center', rotation='vertical')
fig.text(.95, .5, 'Sample Size', va = 'center', rotation='vertical')
fig.text(.45, .9, 'Ideal vs. Actual Critical Strike Rate', va='center')
colors = ['red', 'green', 'blue', 'orange', 'purple']*attacks
ys = datasample(attacks, 'crit_50')
fig.set_size_inches(18.5, 10.5)
for i in range(attacks+1):
    axs[i].plot(idealdata[i], color=colors[i], marker='o', lw=3)
    axs[i].plot(actualdata[i], 'gray', marker='o', lw=3, ls='--')
    axs2[i].bar(actualdata[i], ys[i], width=.1, color=colors[i], alpha = .4)

This is what I'm currently outputting.

1 Ответ

0 голосов
/ 02 декабря 2019

Проблема в оси X баров. В коде actualdata[i] используется как x, в то время как для линейных графиков нет явной оси X. Без явного x, ax.plot() просто использует индекс массива (x = 0,1,2, ...).

Вот некоторый тестовый код с смоделированными данными:

import random
from matplotlib import pyplot as plt

attacks = 5
idealdata = [[random.randrange(2, 5) *.1 if abs(i-j) <= 1 else 0 for j in range(attacks+1)] for i in range(attacks+1)]
actualdata = [[idealdata[i][j] + random.uniform(-.1, .1) if idealdata[i][j] > .1 else 0 for j in range(attacks+1)] for i in range(attacks+1)]
fig, axs = plt.subplots(attacks+1, sharex=True, sharey=True)

fig.text(0.5, 0.04, 'State', ha='center')
fig.text(0.04, 0.5, 'Probability', va='center', rotation='vertical')
fig.text(.95, .5, 'Sample Size', va = 'center', rotation='vertical')
fig.text(.45, .9, 'Ideal vs. Actual Critical Strike Rate', va='center')
ys = [[idealdata[i][j] + random.uniform(-.1, .1) if idealdata[i][j] > .1 else 0 for j in range(attacks+1)] for i in range(attacks+1)]
cmap = plt.get_cmap('rainbow')
fig.set_size_inches(18.5, 10.5)
for i in range(attacks+1):
    axs[i].plot(idealdata[i], color=cmap(i/attacks), marker='o', lw=3)
    axs[i].plot(actualdata[i], 'gray', marker='o', lw=3, ls='--')
    axs[i].bar(range(len(ys[i])), ys[i], width=.1, color=cmap(i/attacks))
plt.show()

Используя actualdata[i] в качестве оси X: before

Используя range(len(ys[i]) в качестве оси X: after

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